【问题标题】:using Html.EditorFor with an IEnumerable<T>将 Html.EditorFor 与 IEnumerable<T> 一起使用
【发布时间】:2011-07-19 01:28:07
【问题描述】:

我有一个自定义类:

public class Person
{
    public String Name { get; set; }
    public Int32 Age { get; set; }
    public List<String> FavoriteFoods { get; set; }

    public Person()
    {
        this.FavoriteFoods = new List<String>();
        this.FavoriteFoods.Add("Jambalya");
    }
}

我将这个类传递给我的强类型视图:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcLearner.Models.Person>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
 Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Create</h2>

    <% using (Html.BeginForm()) { %>
        <%= Html.LabelFor(person => person.Name) %><br />
        <%= Html.EditorFor(person => person.Name) %><br />
        <%= Html.LabelFor(person => person.Age) %><br />
        <%= Html.EditorFor(person => person.Age) %><br />
        <%= Html.LabelFor(person => person.FavoriteFoods[0]) %><br />
        <%= Html.EditorFor(person => person.FavoriteFoods[0]) %>
    <% } %>

</asp:Content>

当我浏览到该页面时,我得到了错误消息:模板只能与字段和属性访问器表达式一起使用。经过一番谷歌搜索,我发现这是因为 EditorFor 和 LabelFor 函数只能接受 Model 对象的即时属性,而 FavoriteFoods[0] 不是即时属性。有没有人可以在不使用字符串指定控件名称的情况下使代码正常工作?这甚至可能吗?理想情况下,我想使用从模型到需要编辑器的项目的表达式,它自己确定输入控件的名称。

尝试了更多的东西,我能够通过对视图的以下更改来完成这项工作:

<% using (Html.BeginForm()) { %>
    <%= Html.LabelFor(person => person.Name) %><br />
    <%= Html.EditorFor(person => person.Name) %><br />
    <%= Html.LabelFor(person => person.Age) %><br />
    <%= Html.EditorFor(person => person.Age) %><br />
    <% foreach (String FavoriteFoods in Model.FavoriteFoods) { %>
        <%= Html.LabelFor(food => FavoriteFoods) %><br />
        <%= Html.EditorFor(food => FavoriteFoods)%><br />
    <% } %>
    <input type="submit" value="Submit" />
<% } %>

请务必注意,EditorFor 和 LabelFor 中表达式的右侧必须是您尝试填充的列表的确切名称,并且列表必须是基本类型(即 String、Int32 等)。但是,当我尝试使用复杂类型时,它仍然失败。我试图显示这个人类的列表,其中包含每个属性的输入,并将它们全部显示给浏览器就好了,但随后它返回一个空列表到我的发布操作。如何让索引显示在列表项的输入名称中?

This was a giant help in figuring out what was going on.

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    我认为这是针对 FavoriteFoods 列表的。它在 ASP.NET MVC v1 中的实现方式是这样的:

    <input type="hidden" name="FavouriteFoods.Index" value="0" />
    

    【讨论】:

    • 您是否必须在 MVC 1 中重建控制器中的类?如果可能的话,我希望这个类由框架构建,并且只为我的控制器提供一个打包好的类来使用。
    • 它为您做到了。我认为这个解决方案预示着 Phil Haack 的帖子 - haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多