我有一个自定义类:
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等)。但是,当我尝试使用复杂类型时,它仍然会失败。我试图显示这个人类的列表,其中包含每个属性的输入,它会将所有这些显示给浏览器,但是它会向我的帖子操作返回一个空列表。如何让索引显示在列表项的输入名称中?
答案 0 :(得分:6)
我认为这是针对FavoriteFoods列表的。如何在ASP.NET MVC v1中完成这样的事情:
<input type="hidden" name="FavouriteFoods.Index" value="0" />