カスタムクラスがあります:
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 など) である必要があることに注意することが重要です。ただし、複合型を使用しようとすると、まだ失敗します。各プロパティの入力を含むこの人物クラスのリストを表示しようとしましたが、それらすべてがブラウザに正常に表示されますが、投稿アクションに null リストが返されます。リストの項目の入力の名前にインデックスを表示するにはどうすればよいですか?