获取控制器中已检查模型的列表

时间:2016-12-20 13:21:41

标签: c# asp.net-mvc actionresult

控制器:

[HttpPost]
public ActionResult GetChecked(FormCollection formCollection)
{
    var checked = formCollection["Checked"].Split(',');
    var ids = formCollection["Original.ID"].Split(',');
}

查看:

@model IEnumerable<Models.Entry> []

<table>
@using (Html.BeginForm("GetChecked", "ControllerName"))
{
        @foreach (var item in Model[0])
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Original.ID)
                    @Html.HiddenFor(modelItem => item.Original.ID)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Original.Name)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.New.Name)
                </td>
                <td>
                    @Html.CheckBoxFor(modelItem => item.Checked)
                </td>
            </tr>
        }
</table>

//Then there's another table with Model[1]

模型

public class Entry
{
    public Entry()
    {
        Original = new SomeObject();
        New = new SomeObject();
        Checked = false;
    }

    public SomeObject Original { get; set; }
    public SomeObject New { get; set; }
    public bool Checked { get; set; }
}

这可行,但我的控制器中的ids - 数组获取了已检查行的true和false值。我读到这是因为FormCollection。 问题:如何让GetChecked取代IEnumerable<Models.Entry>作为参数?当我尝试它时,它导致了一个空值。

2 个答案:

答案 0 :(得分:1)

你应该改变一些事情:

  • 使用CheckBoxFor,EditorFor等从列表或数组渲染控件时,您应该从不使用foreach - 而是始终使用 {{1} } -loop 并将索引应用于您的集合。原因是索引会在for 中创建编号的项目,然后这些项目不再相互冲突,这些编号的项目正是您成功处理提交值列表所需的内容。请参阅此答案以获取一个简单示例:https://stackoverflow.com/a/15375949/1220550

  • 不要使用<form>,而是使用ViewModel类。通过使用FormCollection,您放弃了数据绑定/ FormCollection / ModelState,它们共同构成了ASP.NET MVC的一个极好的功能。在这里解释这一切太过分了,但这里有一个 great link 就是这样。

  • 最好使用完全定义的ViewModel类,不仅用于数据绑定(参见前面),还用于一致性和易用性。将ValidationSummary作为IEnumerable<X>数组最让人困惑,最糟糕的是导致错误。如果你突然想要传递@model怎么办?不可能使用int,还有一块带有ViewModel的蛋糕 - 只需将其添加到课堂中。

答案 1 :(得分:0)

结果为null,因为您应该将IEnumerable接口与模型绑定器绑定。我认为您正在寻找创建模型绑定提供程序,因为提供程序可以查看属性的类型,然后为该属性创建自定义模型绑定程序。

请看这个链接http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx