我为一个对象创建了一个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模板。