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

发布于 2024-10-17 04:40:30 字数 1038 浏览 2 评论 0原文

模型:

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

The Model:

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

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

If I use the default EditorFor(model => model.Entries) the name/id values are:

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

If instead I want to create an EditorFor template like this:

<%@ 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>

The emitted name/id values are:

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

So the name has a period between the property name and [0] and the id has an extra underscore to the left of the index number. This doesn't work with the default model binder. Is there a way to do this that does work with the default model binder?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小耗子 2024-10-24 04:40:30

我认为您可以使用模板完成大部分工作,而不必显式迭代列表,这似乎会导致模型绑定程序出现问题。

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

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>

我唯一还没弄清楚的是如何在 id 属性中获取正确的值div,因此有问号。最后需要注意的是,我在家,所以我还没有真正尝试过这个。

I think you can do most of this using templates without having to explicitly iterate over the list, which seems to be causing your problems with the model binder.

Try making these shared editor templates:

MyObject Editor Template

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

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

Entry Editor Template

<%@ 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>

The only thing I haven't figured out yet is how to get the correct value in the id attribute of the div, hence the question marks. Final caveat is that I'm at home so I haven't actually tried this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文