1

私は次のビューモデルを持っています:

public class ViewModel
{
   //...
   [UIHint("Children")
   public IList<ChildViewModdel> Children {get;set;}
}

ここで、ChildViewModelクラスにはQuantityプロパティ(long型)があります。

子エディタテンプレートは次のとおりです。

@model  IList<ChildViewModel>
@for (var index = 0; index < Model.Count(); index++)
{
    @Html.EditorFor(x => x[index])
}

ここで、モデルをレンダリングします。@Html.EditorForModel()その結果、最初のChildViewModelのQuanityテキストボックス名はChildren.[0].Quantityです。[0]の前にこの余分なポイントがありますか?その結果、モデルバインダーはこれらの値を認識せず、ユーザーがフォームを投稿したときにそれらを正しく処理しません。Children[0].QuantityASP.NET MVCレナー名を作成するにはどうすればよいですか?

4

1 に答える 1

2

最初に、これがちょっと正しい動作であることを述べさせてください (少なくとも「設計による」)。MVC がネストされたプロパティに飛び込むとき、「PropertyName」を追加します。(最後のドットに言及) そのネストされたモデル内のすべてのフィールドの前。だからあなたは「子供たち」を手に入れます。からViewModel、「[0]」。からIList<ChildViewModel>および からの「数量」 ChildViewModel

ここでの主な質問は、なぜ特別なテンプレートが必要なのかということですIList<ChildViewModel>。MVC には IEnumerables を処理するための独自の特殊なケースがあるため、通常は干渉しないでください。

特別な処理が本当に必要な場合はIList<ChildViewModel>、別のクラスにラップして、そのクラスの EditorTemplate に特別なロジックを導入できます。次のようになります。

public class ViewModel
{
   public ChildViewModdels Children {get;set;}
}
public class ChildViewModdels 
{
   public IList<ChildViewModdel> Children {get;set;}
}

そして、ここで ChildViewModdels EditorTemplate の特別なロジックを実行します

@model  ChildViewModdels
@for (var index = 0; index < Model.Children.Count(); index++)
{
    @Html.EditorFor(x => x.Children[index])
}

繰り返しますが、これは、その特別なロジックが本当に必要な場合のケースです(質問からは不明です)。

于 2012-07-19T17:54:41.777 に答える