1

例えば:

モデル

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」のモデルアイテムが必要です。

4

1 に答える 1

3

IEnumerable<T>との両方に同じテンプレートを使用できるはずですT。テンプレートはIEnumerableを列挙するのに十分賢いですが、タイプ名と一致するようにエディターテンプレートの名前を変更する必要があります。その後、あなたは使用できるはずです

@model IList<MvcApplication1.Models.Person>

@using (Html.BeginForm())
{       
    @Html.EditorForModel()    
}

残念ながら、タイプ名以外の名前のテンプレートは例外をスローするようです

ディクショナリに渡されるモデルアイテムのタイプは「MvcApplication1.Models.Person[]」ですが、このディクショナリにはタイプ「MvcApplication1.Models.Person」のモデルアイテムが必要です。

于 2013-01-31T20:22:29.563 に答える