Asp.net MVC。 EditorTemplate或@ Html.Action / Partial中的重复名称

时间:2013-02-27 16:16:48

标签: asp.net-mvc-3 razor modelbinder

在对这个问题进行了大量搜索后,我向社区提出了帮助:

我在视图中做了类似的事情(如果我使用@ Html.Action或PartialView

,问题就是一样的
@for(int i= 0; i< Model.Contacts.Count(); i++)
{
     @Html.EditorFor(m => m.Contacts[i] , "AccreditationContact" )
}

我有一个经典的EditorTemplate或PartialView,就像那样

    @model FrontOffice.Models.AccreditationStepSevenModel

    <div>
        @Html.LabelFor(m => m.Nom)
        @Html.TextBoxFor(m => m.Nom)
        @Html.ValidationMessageFor(m => m.Nom)
    </div>
[There is a lots of other fields here] 

为“Nom”字段生成的html看起来像这样:

    <input id="Contacts_0__Nom" name="Contacts[0].Nom" type="text" value="Doe" > 
    <input id="Contacts_1__Nom" name="Contacts[1].Nom" type="text" value="Doe1" >
    <input id="Contacts_2__Nom" name="Contacts[2].Nom" type="text" value="Doe2" >

当我提交表单时没有问题,我的控制器中的本机ModelBinder正确地将所有字段绑定到数组中

现在我想动态地在javascript中生成另一个AccreditationStepSevenModel,我在Jquery中使用了$ load。问题是生成的html没有增加名称然后我有多个具有相同名称的字段,我的ModelBinder不再工作...

我考虑过在javascript中重命名名称,这样可行,但是有更好的解决方案吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

默认的ModelBinder只有在索引是完整的整数序列时才有效,从0开始,每个元素增加1。 要支持非顺序索引,您必须对索引器进行spicify,例如

<input type="hidden" name="Contacts.Index" value="0" />     
<input id="Contacts_0__Nom" name="Contacts[0].Nom" type="text" value="Doe" >

请参阅此博客文章以了解相关信息:Editing a variable length list, ASP.NET MVC 2-style

答案 1 :(得分:0)

我已经找到了如何使客户端验证工作:

在ajax调用之后,我们需要重置这样的验证器:  $(“#addAccredBtn”)。click(function(){

            $.ajax({
                url: this.href,
                cache: false,
                success: function (html) {
                    $("#accreds").append(html);

                    var form = $("#myform");
                    form.removeData("validator");
                    form.removeData("unobtrusiveValidation");
                    $.validator.unobtrusive.parse("#myform");
                }
            });


            return false;
        });