ASP.NET MVC表单BeginCollectionItem - 使用EditorFor而不是Partial

时间:2015-04-20 09:40:26

标签: c# asp.net-mvc asp.net-mvc-4 razor

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

最初,我使用EditorFor Razor Methods获取了所有表单字段。

主要表格

@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/

样本将其用作部分。即

主要

@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模板。

0 个答案:

没有答案