私の MVC4 プロジェクトには、製品ビュー モデルのコレクションを持つカテゴリ ビュー モデルがあります。エディター テンプレートを使用して単一の製品ビュー モデルをレンダリングし、製品ビュー モデルのコレクションをそれに渡します。
カテゴリ ビュー モデル:
@model CategoryViewModel
@using MVC4PartialViews.Models.ViewModels
<div class="editor-field">
@Html.EditorFor(model => model.CategoryName)
@Html.ValidationMessageFor(model => model.CategoryName)
</div>
@Html.EditorFor(x => x.Products)
コレクション内の各製品をレンダリングするエディター テンプレート:
<div class="editor-field">
@Html.EditorFor(model => model.ProductName)
@Html.ValidationMessageFor(model => model.ProductName)
</div>
// etc.
これは、要素に自動的に名前を付けて正しくインデックス付けするため、非常にうまく機能し、すべての製品が親のカテゴリビューモデルの一部としてポストバックされます-出力は次のとおりです。
<div class="editor-field">
<input class="text-box single-line" id="Products_0__ProductName" name="Products[0].ProductName" type="text" value="Add 1st product for this Category" />
<span class="field-validation-valid" data-valmsg-for="Products[0].ProductName" data-valmsg-replace="true"></span>
</div>
ユーザーが製品を追加および削除できるようにする必要があります。新しいものを追加するには、エディター テンプレートを動的にレンダリングして新しい製品を作成し、各フィールドに正しくインデックス付け/名前を付ける必要があります。つまり、既に 2 つの製品 (インデックス 0 と 1) がある場合、新しい製品にはそのような:
Products[2].ProductName
Steve Sanderson によるこの記事を読みましたが、それは不格好に思えます。彼は連続したインデックス フィールドではなく、Guid を使用してフィールドにインデックスを付けています。
ティア