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属性这样的东西污染您的标记.

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...