控制器:
[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>
作为参数?当我尝试它时,它导致了一个空值。
答案 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