编辑器模板集合没有绑定在帖子上

时间:2016-01-18 20:20:49

标签: c# model-view-controller asp.net-mvc-5 model-binding mvc-editor-templates

我有一个主视图模型,其中包含要编辑的子视图模型列表:

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属性中的所有项目。

这里有什么问题?

1 个答案:

答案 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)

一切似乎都很好。