我有一个从视图模型填充的视图,其中一个属性是复杂类型的集合。视图正确呈现,列表被迭代到一个表中,每个项目的单选按钮都没有被选中。当我提交表单时,我无法将对象列表返回到模型中,我无法弄清楚我做错了什么。集合中的每个项目都将添加到视图中,如下所示:
@for (int i = 0; i < Model.Items.Count; i++
var rowClass = "selectRow";
if (item.IsSelected)
{
rowClass = "success";
}
<tr class="@rowClass">
@Html.HiddenFor(m => m.Items[i].PropertyOne)
<td>
@Html.DisplayFor(m => m.Items[i].PropertyTwo)
</td>
<td class="actions">
// only those items not previously selected need a radio button
@if (item.IsSelected == false)
{
@Html.RadioButtonFor(m => m.Items[i].IsSelected, m.Items[i].PropertyOne, new { id = "IsSelected_" + m.Items[i].PropertyOne })
}
</td>
</tr>
}
我尝试过使用@ Html.HiddenFor(x =&gt; x.PropertyOne),但我无法将所选值的集合绑定回模型。我可以使用隐藏字段返回模型中的其他所有内容,但我不知道如何解决这个问题。任何帮助表示赞赏。
由于
答案 0 :(得分:2)
如果您希望集合正确发布到模型绑定器,则不能使用foreach
循环(除非您使用EditorFor
,请参阅注释)。您必须使用旧的for
循环,并使您的集合派生自IList
。有关详细信息,请参阅我的问题和答案here。
此外,您希望发布的集合对象类型的任何属性,您需要确保它在循环中使用。所以,假设您的Item
课程如下:
public class Item
{
public int ItemId { get; set; }
public string ItemDescription { get; set; }
public bool IsSelected { get; set; }
}
...你的循环可能如下所示:
@for(var i = 0;i < Model.Items.Count; i++)
{
<tr>
@Html.HiddenFor(m => Model.Items[i].ItemId)
<td>
@Html.TextBoxFor(m => Model.Items[i].Description)
</td>
<td>
@Html.CheckBoxFor(m => Model.Items[i].IsSelected)
</td>
</tr>
}
同样重要的是要注意,仅显示模型属性将不会发布它。意思是......
@Model.Items[i].Description
...不会发布,但会将其隐藏或在HTML元素中使用...
@Html.HiddenFor(m => Model.Items[i].Description)
将正确发布和绑定。
可以找到Phil Haack关于此主题的权威文章之一here。