我为一个对象创建了一个 EditorFor Template,该对象具有多个集合和集合中的集合。我必须这样做,以便我可以删除并添加项目到集合列表,并仍然有模型验证工作。

最初,我使用 EditorFor Razor 方法获得了所有表单字段。

主要表格

@using (Ajax.BeginForm("EditEvent", null, new AjaxOptions() { HttpMethod =    "Post" }, new { @id = "valEditEvent", @class = "valEditEvent" }))
@for (int i = 0; i < Model.Rooms.Count(); i++)
{
    @Html.EditorFor(model => model.Rooms[i], "RoomEditVm")
}

房间编辑模板视图

@model Ltd.Event.Room
<tr class="roomRow">
    <td>
        @Html.TextAreaFor(model => model.RoomName, new { @class = "RoomNameBox" })
    </td>
    <td class="deleteContainer">
        <img class="deleteRoom Right" src="@Url.Content("~/img/close.png")" />
    </td>
</tr>
<tr>
    <td colspan="2"><span>Click To Add Another Room</td>
</tr>

因为我已经深入了解了几个集合,所以跟踪表单中每个集合的索引很容易出错,因此我使用 Steve Sanderson 的 BeginCollectionItem 为每个集合项分配一个 Guid。

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

https://github.com/danludwig/BeginCollectionItem **这是一个很好的教程

http://ivanz.com/2011/06/16/editing-variable-length-reorderable-collections-in-asp-net-mvc-part-1/

该示例将其用作 Partial。即。

主要

@foreach(Ltd.Event.Room rm in this.Event.Rooms)
{
    Html.RenderPartial("RoomPartialVm", rm);
}

房间编辑部分视图

@model Ltd.Event.Room
<tr class="roomRow">
  @using (Html.BeginCollectionItem(ViewData.TemplateInfo.HtmlFieldPrefix + ".Rooms"))
    {
      <td>
        @Html.TextAreaFor(model => model.RoomName, new { @class = "RoomNameBox" })
      </td>
      <td class="deleteContainer">
          <img class="deleteRoom Right" src="@Url.Content("~/img/close.png")" />
      </td>
  }
</tr>
<tr>
    <td colspan="2"><span>Click To Add Another Room</td>
</tr>

这是使ViewData.TemplateInfo.HtmlFieldPrefix用于为表单字段的嵌套集合的名称添加前缀所必需的。 EditorFor 并没有完全正确地做到这一点。

使用 EditorFor Templates 需要的是将 Views 分离到一个单独的文件夹中。有没有办法可以将这些部分用作 EditorFor 模板。