例えば:
モデル
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Personのエディターテンプレート(PersonEditor.cshtml):
@model MvcApplication1.Models.Person
@Html.HiddenFor(x=>x.ID)
<label>First Name</label>
@Html.TextBoxFor(x=>x.FirstName)
<label>Last Name</label>
@Html.TextBoxFor(x=>x.LastName)
<br />
メインページで、次のことができるようにしたいと思います。
@model IList<MvcApplication1.Models.Person>
@using (Html.BeginForm())
{
@Html.EditorFor(x=>x,"PersonEditor")
}
そして、フォームにすべての要素を入れて、適切な名前を自動的に生成します。私が今しているようにコレクションをループする代わりに:
@using (Html.BeginForm())
{
for (int i = 0; i < Model.Count; i++)
{
@Html.EditorFor(x=>Model[i],"PersonEditor")
}
}
フォーム要素には、次の形式が含まれている必要があります。
<input name="[0].ID" type="text" value="Some ID" />
<input name="[0].FirstName" type="text" value="Some value" />
<input name="[1].ID" type="text" value="Some x" />
<input name="[1].FirstName" type="text" value="Some y" />
等々...
私のコントローラーではIList<Person>
、フォームの投稿がパックされたときに受け取ることを期待しているためです。
そのforループを完全に排除できますか?
編集
今のところ、単純に@Html.EditorFor(x=>x)
(つまり、ループなしで)実行すると、次の例外が発生します。
ディクショナリに渡されるモデルアイテムのタイプは「MvcApplication1.Models.Person[]」ですが、このディクショナリにはタイプ「MvcApplication1.Models.Person」のモデルアイテムが必要です。