2

私の 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>

エディター テンプレートのフィールドをノックアウトにバインドするにはどうすればよいですか? エディター テンプレートが要素に名前を付けるために使用するインデックス値に何らかの方法でアクセスまたは使用することはできますか? 以下のように、親(カテゴリ)ビューモデルで問題なくフィールドをバインドできます。

<script>
    window.defaultCategory = @Html.Raw(Json.Encode(Model));
</script>

@Html.TextBoxFor(
    model => model.CategoryName,
    new Dictionary<string, object>
    {
        {"style", "width: 30%;"},
        {"placeholder", "Please enter the Category name"},
        { "data-bind", "value: currentCategory.CategoryName" }
    })

次のようなものを作成する必要があります。[n] は、Editor Template が Products コレクション内の各 Product をレンダリングするときに生成されるインデックス値です。

{ "data-bind", "value: currentCategory.Products[n].ProductName" }

または、次のようにする必要があります。

{ "data-bind", "value: currentCategory.Products()[n].ProductName" }

すべてのヘルプまたはアイデアを歓迎します:)

4

1 に答える 1

1

TemplateInfo から現在のインデックスを抽出できます。

@model ProductViewModel

<div class="editor-field">    
    @Html.TextBoxFor(
        model => model.ProductName,
        new {
            style = "width: 30%;",
            placeholder = "Please enter the Category name",
            data_bind = string.Format(
                "value: currentCategory.{0}.ProductName",
                ViewData.TemplateInfo.HtmlFieldPrefix
            )
        }
    )
    @Html.ValidationMessageFor(model => model.ProductName)
</div>
于 2012-07-20T12:48:44.997 に答える