asp.net-mvc – 将集合传递给EditorFor()时,它会为输入元素生成无效的名称

前端之家收集整理的这篇文章主要介绍了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属性这样的东西污染您的标记.

猜你在找的asp.Net相关文章