这大概会是个大坑……
好的,所以我正在构建一个 MVC4 网站,该网站有一个中频主题,能够编辑父记录以及在同一页面上添加/删除/编辑子记录。使用 MVC 的魔力,我可以为子记录定义部分视图,如下所示:
@model NFBC.Models.SubMap
<tr id="@String.Concat("SubMap", ViewBag.Index)">
<td class="mapname">
<input type="hidden" name="submaps[@ViewBag.Index].Id" value="@Model.Id" />
<input type="text" name="submaps[@ViewBag.Index].MapName" value="@Model.MapName" />
</td>
<td class="miles"><input type="text" name="submaps[@ViewBag.Index].Miles" value="@Model.Miles" /></td>
<td class="difficulty">@Html.DropDownList("submaps[" + (string)ViewBag.Index.ToString() + "].DifficultyId", (SelectList)ViewBag.Difficulty(Model.DifficultyId))</td>
<td class="elevation"><input type="text" name="submaps[@ViewBag.Index].Elevation" value="@Model.Elevation" /></td>
<td class="mapfile"><input type="text" name="submaps[@ViewBag.Index].MapFile" value="@Model.MapFile" /></td>
<td class="delete"><img src="~/Images/Error_red_16x16.png" /></td>
</tr>
然后在父视图中,我只需调用局部视图来渲染其所有子视图:
<table id="ChoicesTable">
<thead>
<tr>
<th>Map Name</th>
<th>Miles</th>
<th>Difficulty</th>
<th>Elevation</th>
<th>Map File</th>
<th></th>
</tr>
</thead>
for (int i = 0; i < Model.SubMaps.Count; i++)
{
var map = Model.SubMaps.ElementAt(i);
ViewBag.Index = i;
Html.RenderPartial("_MapChoiceEditRow", map);
}
</table>
我找不到有关“子实体”名称语法的任何文档(即:name="subMaps[@ViewBag.Index].Id"),但它在绑定到模型时有效;只要索引值从 0 开始并且没有丢失任何值(即:0、1、2、4、5 将导致仅绑定 0、1 和 2),所有子项都会被填充。使用 jQuery 的 Ajax 调用的魔力,我能够在客户端动态插入和删除行。
问题是我根本无法找到一种可靠地将@Html.EditorFor() 与子实体控件一起使用的方法。这将是一个非常好的功能,因为 EditorFor 将所有不显眼的 jquery 验证属性注入到 html 中。现在我基本上被迫通过在所有地方添加我自己的“data-val ='true'”标签(示例中没有显示,我还没有这样做)来模拟这种行为,这对我来说似乎非常混乱.
所以我有了一个绝妙的主意,即采用内置模板并创建自己的模板来注入这些东西(以及我自己的一些其他东西,例如“帮助”文本的引导程序“占位符”属性,也许还有工具提示, ETC)。我下载了 MVC 源代码并打开了默认的编辑器模板,但是我没有看到呈现不显眼的值的标记,而是得到了一大堆帮助函数,它们在某些时候“神奇地”呈现了不显眼的属性。我无法弄清楚它是如何完成的,因为验证内容都被打包到我无法访问的内部类中。
我是否在这里遗漏了什么,或者这只是 MVC 的一个弱点,我将不得不解决这个问题。我真的很想不需要自己模拟不显眼的验证属性生成代码,但如果这是我想我可以做到的唯一解决方案......
谢谢!