【问题标题】:MVC 3 with Forms and Lists: default model binder and EditorFor带有表单和列表的 MVC 3:默认模型绑定器和 EditorFor
【发布时间】:2011-02-11 09:34:17
【问题描述】:

模型:

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

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

如果我使用默认的 EditorFor(model => 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 在索引号的左侧有一个额外的下划线。这不适用于默认模型绑定器。有没有一种方法可以与默认模型绑定器一起使用?

【问题讨论】:

  • 为什么要这样做?您只是想获得包含验证消息,还是真的需要设置带有 ID 的 div 标签?
  • 我这样做是为了在列表末尾有一个通用的基于 jQuery 的“添加”选项来添加另一个元素。使用该 HTML 发出列表可以更容易地使“添加”通用。考虑一种形式,其中一个部分需要 N 个引用(每个引用具有多个属性),另一部分需要 N 个关于其他内容的详细信息(每个部分具有多个属性),等等...

标签: asp.net-mvc forms defaultmodelbinder


【解决方案1】:

我认为您可以使用模板完成大部分操作,而无需显式迭代列表,这似乎会导致您的模型绑定器出现问题。

尝试制作这些共享编辑器模板:

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

【讨论】:

  • 这行得通,我能够关闭 id 并完成我需要做的事情。我认为它实际上是无效的 HTML(如果有多个列表,则可能有重复的 id),所以最后这样更好!谢谢!
  • 最有帮助,干净,简单。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多