0

在对这个问题进行了大量搜索之后,我正在向社区寻求帮助:

我在视图中做类似的事情(如果我使用@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,我使用了 $load 和 Jquery。问题是生成的 html 不会增加名称然后我有多个具有相同名称的字段并且我的 ModelBinder 不再工作......

我想过在javascript中重命名名称,这会起作用,但是有更好的解决方案吗?

谢谢你的帮助 !

4

2 回答 2

0

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

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

请参阅此博客文章以了解想法:编辑可变长度列表,ASP.NET MVC 2-style

于 2013-02-28T09:53:02.823 回答
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;
        });
于 2013-02-28T15:53:13.667 回答