2011-02-11 58 views
3

模型:MVC 3形式和列表:默认模型粘合剂和EditorFor

public class MyObject 
{ 
    public IList<Entry> Entries; 
} 

public class Entry 
{ 
    public string Name { get; set; } 
} 

如果我使用默认EditorFor(型号=> model.Entries)的名称/ ID值是:

<input type="text" value="" name="Entries[0].Name" id="Entries_0__Name"> 

相反,如果我想创建一个模板EditorFor像这样:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<CMS.Models.MyObject>>" %> 

<div class="list"> 
<% 
    for (int i = 0; i < Model.Count; i++) 
    { %> 
    <div class="object" id="<%: i %>"> 
     <%: Html.EditorFor(model => Model[i]) %> 
     <%: Html.ValidationMessageFor(model => Model[i]) %> 
    </div> 
<% } %> 
</div> 

所发出的名称/ ID值是:

<input type="text" value="" name="Entries.[0].Name" id="Entries__0__Name"> 

因此,名称在属性名称和[0]之间有一段时间,id在索引号的左侧有一个额外的下划线。这不适用于默认模型联编程序。有没有办法做到这一点,使用默认的模型联编程序?

+1

你为什么要这样做?你只是想要包含验证信息,或者真的需要使用ID集合来设置div标签吗? – 2011-02-11 01:13:36

+0

我这样做是为了让我可以在列表的末尾添加一个通用的基于jQuery的“添加”选项来添加另一个元素。使用该HTML发布列表使得“添加”泛型更容易。想想一个表格,其中一个部分需要N个引用(每个引用具有多个属性),另一个部分需要N个关于其他东西的详细信息(每个部分都有多个属性)等... – Cymen 2011-02-11 01:16:03

回答

3

我认为你可以使用模板做大部分工作,而不必在列表中显式迭代,这似乎是导致模型联编程序的问题。

尝试使这些共享编辑模板:

MyObject来编辑模板

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CMS.Models.MyObject>" %> 

<div class="list"> 
    <%: Html.EditorFor(m => m.Entries) %> 
</div> 

条目编辑器模板

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CMS.Models.Entry>" %> 

<div class="object" id="<%: ??? %>"> 
    <%: Html.EditorFor(m => m.Name) %> 
    <%: Html.ValidationMessageFor(m => m.Name) %> 
</div> 

我还没有想出的唯一事情是如何在div的id属性中获得正确的值,因此是问题灰色标记。最后的警告是,我在家里,所以我没有真正尝试过。