asp.net-mvc – 将集合传递给EditorFor()时,它会为输入元素生成
我有一本BookCreateModel,它包括书的飞机信息,如标题,PublishYear&等等书籍作者(复杂类型)的集合:
public class BookCreateModel { public string Title { get; set; } public int Year { get; set; } public IList<AuthorEntryModel> Authors { get; set; } } public class AuthorEntryModel { public string FirstName { get; set; } public string LastName { get; set; } } 在CreateBook视图中我使用了EditorFor Helper: @Html.EditorFor(m => m.Authors,"AuthorSelector") EDIT1: 和AuthorSelector模板如下: <div class="ptr_authors_wrapper"> @for (int i = 0; i < Model.Count; i++) { <div class="ptr_author_line" data-line-index="@i"> @Html.TextBoxFor(o => o[i].FirstName) @Html.TextBoxFor(o => o[i].LastName) </div> } </div> <script> ... </script> AuthorSelector模板包含一些需要注意每个渲染项目的索引的包装标记,还有一些处理子输入的交互并需要渲染一次(在AuthorSelector模板中)的JavaScript,从而摆脱了for循环/或AuthorSelector模板是不可能的. 现在的问题就是EditorFor的动作有点奇怪,生成这样的输入名称: <input id="Authors__0__FirstName" name="Authors.[0].FirstName" type="text" value="" /> <input id="Authors__0__LastName" name="Authors.[0].LastName" type="text" value="" /> 您可以看到,而不是生成名称,如Authors [0] .FirstName它添加了一个额外的点,使默认模型binder无法解析发布的数据. 任何想法 ? 谢谢 ! 解决方法
我建议你坚持约定,即替换:
@Html.EditorFor(m => m.Authors,"AuthorSelector") 有: @Html.EditorFor(m => m.Authors) 然后将?/ Views / Shared / EditorTemplates / AuthorSelector.cshtml重命名为?/ Views / Shared / EditorTemplates / AuthorEntryModel.cshtml,并将其强制输入到单个AuthorEntryModel模型,并摆脱循环: @model AuthorEntryModel @Html.TextBoxFor(o => o.FirstName) @Html.TextBoxFor(o => o.LastName) ASP.NET MVC将自动呈现集合的所有元素的编辑器模板,并生成正确的名称. 更新: 看到你的更新在这里是我的回应: 在你的主要观点: <div class="ptr_authors_wrapper"> @Html.EditorFor(m => m.Authors) </div> 在你的编辑器模板中: @model AuthorEntryModel <div class="ptr_author_line"> @Html.TextBoxFor(o => o.FirstName) @Html.TextBoxFor(o => o.LastName) </div> 你会注意到模板中没有脚本是完全正常的.脚本与标记无关.他们进入单独的javascript文件.在这个文件中,您可以使用jQuery来做任何你需要做的标记.它给出了诸如.index()之类的方法,它允许您在匹配的选择器中获取元素的索引,以便您不需要编写任何循环,并用诸如data-line-index属性这样的东西污染您的标记. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |