2013-02-27 73 views
0

在这个问题上搜索了很多,我阿斯金帮助社区后:Asp.net MVC。在EditorTemplate或@ Html.Action重名/部分

我在做财产以后这样的视图(问题是相同的,如果我使用@ 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] 

为现场生成的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" > 

当我提交我的形式在这里没问题,一切都正常在我的控制器

现在我想以动态的JavaScript生成另一个AccreditationStepSevenModel绑定到一个数组由本地ModelBinder的,我使用的用Jquery加载$。问题是,生成的HTML不增加名称,然后我有多个字段具有相同的名称,我的ModelBinder不工作了...

我想过在JavaScript中重命名的名称,这将工作,但有更好的解决方案吗?

感谢您的帮助!

回答

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" > 

看到这个博客帖子的想法:Editing a variable length list, ASP.NET MVC 2-style

+0

感谢Kibria,这是链接的我一直在寻找。我在想,如果微软在MVC弗拉姆想过那种ework但显然不是...... Steeve的帮手很棒! – 2013-02-28 13:08:45

+0

实际上,Steeve的解决方案效果很好,除了客户端验证不起作用......但我会满意它 – 2013-02-28 15:32:26

0

我发现如何使客户端验证工作:

Ajax调用,我们需要重新验证这样的后: $(“#addAccredBtn”)。点击(函数(){

  $.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; 
     });