我有一个主视图模型,其中包含要编辑的子视图模型列表:
public class MyObjectGridViewModel
{
public string Comment { get; set; }
public List<MyObject> Objects { get; set; } = new List<MyObject>();
}
MyObject
的结构实际上根本不相关。然后我有Objects
集合的编辑器模板,如下所示:
@model MyObject
<tr>
<td class="hidden">
@Html.HiddenFor(m => m.Id)
</td>
<td>
@Html.DisplayFor(m => m.Name)
</td>
<td>
@Html.CheckBoxFor(m => m.IsBanned, new { @class = "checkbox" })
</td>
</tr>
然后是一个表单视图,用于内联编辑单个MyObject
模型,即没有单独的Edit
视图:
@model MyObjectGridViewModel
@using (Html.BeginForm("Ban", "Access", FormMethod.Post, new { role = "form" }))
{
@Html.TextBoxFor(m => m.Comment)
<table class="table bans">
@Html.EditorFor(m => m.Objects)
</table>
<input type="submit" value="Save" />
}
控制器上的帖子操作:
[HttpPost]
public ActionResult Ban(MyObjectGridViewModel model)
{
var items = model.Objects.Count(); // items == 0
}
然而,当我单击提交按钮并调用此操作时,model.Objects
列表中的项目为零。编辑器模板显示预期的5个项目,我检查1或2个复选框,提交并丢失Objects
属性中的所有项目。
这里有什么问题?
答案 0 :(得分:0)
我发现了一些旧代码,看起来解决方案是为主视图模型创建一个编辑器模板,在其中,使用另一个用于集合项。我现在有:
MyObjectGridViewModel.cshtml:
@model MyObjectGridViewModel
@Html.EditorFor(model => Model.Objects)
MyObject.cshtml:
@model MyObject
<tr>
<td class="hidden">
@Html.HiddenFor(m => m.Id)
</td>
<td>
@Html.DisplayFor(m => m.Name)
</td>
<td>
@Html.CheckBoxFor(m => m.IsBanned, new { @class = "checkbox" })
</td>
</tr>
在表单中,而不是
@Html.EditorFor(m => Model.Objects)
我现在有
@Html.EditorFor(m => Model)
一切似乎都很好。