带有表单和列表的MVC 3:默认模型绑定器和EditorFor

时间:2011-02-11 00:56:13

标签: asp.net-mvc forms defaultmodelbinder

模特:

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

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

如果我使用默认的EditorFor(model =&gt; 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 个答案:

答案 0 :(得分: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属性中获取正确的值,因此问号。最后需要注意的是,我在家,所以我还没有尝试过这个。