在对这个问题进行了大量搜索后,我向社区提出了帮助:
我在视图中做了类似的事情(如果我使用@ 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中重命名名称,这样可行,但是有更好的解决方案吗?
感谢您的帮助!
答案 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;
});