我有一个PersonViewModel,它包含多个List<SubViewModel>
(名称,地址等)
我有一个Html表单,其中包含每个SubViewModel的表格,用户可以在其中更新,添加,删除和设置项目到该人员的主要条目。
名称的简化表:
@foreach (PersonNameViewModel name in Model.Names)
{
<tr>
<td>
@Html.DisplayFor(modelItem => name.FullName)
</td>
<td>
@Html.DisplayFor(modelItem => name.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => name.MiddleName)
</td>
<td>
@Html.DisplayFor(modelItem => name.LastName)
</td>
<td class="center">
@Html.RadioButtonFor(modelItem => name.IsPrimary, "")
</td>
<td class="center">
@Html.CheckBoxFor(modelItem => name.ToDelete)
</td>
</tr>
}
从这里开始,我不知道如何在用户提交表单时将所有数据返回到PersonViewModel,以更新人员记录。如果我只是在我的POST控制器中接受PersonViewModel
,它就完全是空的。我查看了FormCollection,但我不确定这是否正确。有经验的人可以指出我正确的方向来建立我的模型备份更新吗?非常感谢你。
答案 0 :(得分:3)
每个人的回答都是正确的,但如果您想更新人们的信息,则需要使用Html Helper Editor
NOT Display
。此外,您仍然可以在视图中使用foreach
,只需更改如下:
@foreach (var name in Model.Names.Select((value, i) => new { i, value }))
{
<tr>
<td>
@Html.EditorFor(m => m.Names[@name.i].FullName)
</td>
<td>
@Html.EditorFor(m => m.Names[@name.i].FirstName)
</td>
<td>
@Html.EditorFor(m => m.Names[@name.i].MiddleName)
</td>
<td>
@Html.EditorFor(m => m.Names[@name.i].LastName)
</td>
<td class="center">
@Html.RadioButtonFor(m => m.Names[@name.i].IsPrimary,"")
</td>
<td class="center">
@Html.CheckBoxFor(m => m.Names[@name.i].ToDelete)
</td>
</tr>
}
答案 1 :(得分:1)
你应该像这样使用(关于集合和复杂数据here的模型绑定的好文章):
@for(var i = 0;i < Model.Names.Count;i++)
{
<tr>
<td>
@Html.DisplayFor(m => Model.Names[i].FullName)
</td>
<td>
@Html.DisplayFor(m => Model.Names[i].FirstName)
</td>
<td>
@Html.DisplayFor(m => Model.Names[i].MiddleName)
</td>
<td>
@Html.DisplayFor(m => Model.Names[i].LastName)
</td>
<td class="center">
@Html.RadioButtonFor(m => Model.Names[i].IsPrimary, "")
</td>
<td class="center">
@Html.CheckBoxFor(m => Model.Names[i].ToDelete)
</td>
</tr>
}
答案 2 :(得分:1)
尝试用for循环替换foreach:
@for (int i = 0; i < Model.Names.Count; i++)
{
<tr>
<td>
@Html.DisplayFor(m => m.Names[i].FullName)
</td>
<td>
@Html.DisplayFor(m => m.Names[i].FirstName)
</td>
<td>
@Html.DisplayFor(m => m.Names[i].MiddleName)
</td>
<td>
@Html.DisplayFor(m => m.Names[i].LastName)
</td>
<td class="center">
@Html.RadioButtonFor(m => m.Names[i].IsPrimary, "")
</td>
<td class="center">
@Html.CheckBoxFor(m => m.Names[i].ToDelete)
</td>
</tr>
}
表达式解析/模型绑定使用索引比使用foreach临时变量做得更好。