0

次のように、Package、Feature、PackageFeature の 3 つのエンティティがあります。

パッケージ:
PackageId (PK)
PackageTitle

機能:
FeatureId (PK)
FeatureTitle

PackageFeature:
PackageFeatureId (PK)
PackageId (FK)
機能 (FK)
数量

「Package」と入力された MVC ビューがあり、ユーザーが PackageFeature エンティティの Quantity フィールドを編集できるようになり、以下のソース コードが生成されます。コントローラーでこれを取得するにはどうすればよいですか? 試してみまし[Bind(Include = "PackageFeature")]List<Package> packageList<PackageFeature> packageFeatureが、デバッガーで前者を表示すると、リスト項目の正しい数 (4) が得られますが、PackageIds はすべて 0 であり、その結果、0 項目の PackageFeature リストがあり、後者も 4 のリストを生成します8 つの PackageFeatures があるため正しくないアイテム - ただし、PackageIds は正しく、他のすべては 0/null に設定されています。

<form action="/packages/features/" method="post">

<h3>Basic</h3>

<input data-val="true" data-val-number="..." data-val-required="..." name="[0].PackageId" type="hidden" value="2" />

<ul>
    <li>
        <span>No. of Categories (e.g. Plumber)</span>
        <input data-val="true" data-val-number="..." name="[0].PackageFeature[8].Quantity" type="text" value="1" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[0].PackageFeature[8].PackageFeatureId" type="hidden" value="9" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[0].PackageFeature[8].PackageId" type="hidden" value="2" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[0].PackageFeature[8].FeatureId" type="hidden" value="9" />
    </li>
    <li>
        <span>No. of Regions (e.g. Sydney City)</span>
        <input data-val="true" data-val-number="..." name="[0].PackageFeature[9].Quantity" type="text" value="1" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[0].PackageFeature[9].PackageFeatureId" type="hidden" value="10" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[0].PackageFeature[9].PackageId" type="hidden" value="2" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[0].PackageFeature[9].FeatureId" type="hidden" value="10" />
    </li>
</ul>

<h3>Bronze</h3>

<input data-val="true" data-val-number="..." data-val-required="..." name="[1].PackageId" type="hidden" value="3" />

<ul>
    <li>
        <span>No. of Categories (e.g. Plumber)</span>
        <input data-val="true" data-val-number="..." name="[1].PackageFeature[8].Quantity" type="text" value="2" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[1].PackageFeature[8].PackageFeatureId" type="hidden" value="19" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[1].PackageFeature[8].PackageId" type="hidden" value="3" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[1].PackageFeature[8].FeatureId" type="hidden" value="9" />
    </li>


    <li>
        <span>No. of Regions (e.g. Sydney City)</span>
        <input data-val="true" data-val-number="..." name="[1].PackageFeature[9].Quantity" type="text" value="4" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[1].PackageFeature[9].PackageFeatureId" type="hidden" value="20" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[1].PackageFeature[9].PackageId" type="hidden" value="3" />
        <input data-val="true" data-val-number="..." data-val-required="..." name="[1].PackageFeature[9].FeatureId" type="hidden" value="10" />
    </li>
</ul>

<!-- above repeated again for 2 more packages-->

編集:

上記の生成に使用されるコード:

パッケージ/Features.cshtml:

@model List<RenovateDTL.Package>

@{
    ViewBag.Title = "Package Features";
    Layout = "~/Views/Shared/_OneColumnLayout.cshtml";
}

<h2>Package Features</h2>

@using (Html.BeginForm())
{
    @Html.DisplayForModel()

    <button type="submit">Save Changes</button>
}

パッケージ/DisplayTemplates/Package.cshtml:

@model RenovateDTL.Package

<h3>@Model.Title</h3>

@Html.HiddenFor(m => m.PackageId)

<ul>
    @Html.EditorFor(m => m.PackageFeature)
</ul>

/Packages/EditorTemplates/PackageFeature.cshtml:

@model RenovateDTL.PackageFeature

@using RenovateDTL.Enum

@if (Model.FeatureId == (int)FeatureId.NumberOfCategoriesAllowed || Model.FeatureId == (int)FeatureId.NumberOfRegions)
{
    <li>
        <span>@Model.Feature.Title</span>
        @Html.TextBoxFor(m => m.Quantity)
        @Html.HiddenFor(m => m.PackageFeatureId)
        @Html.HiddenFor(m => m.PackageId)
        @Html.HiddenFor(m => m.FeatureId)
    </li>
}
4

1 に答える 1

0

私はこれを PackageFeature.cshtml テンプレートの回避策として行いましたが、誰かが持っている場合は、より合理化されたすぐに使えるソリューションを好むと思います。

@model RenovateDTL.PackageFeature

@{
    ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "PackageFeature[" + Model.PackageFeatureId + "]";
}

@if (Model.FeatureId == (int)FeatureId.NumberOfCategoriesAllowed || Model.FeatureId == (int)FeatureId.NumberOfRegions)
{
    <li>
        <span>@Model.Feature.Title</span>
        <input type="hidden" name="PackageFeature.Index" value="@Model.PackageFeatureId" />
        @Html.TextBoxFor(m => m.Quantity)
        @Html.HiddenFor(m => m.PackageFeatureId)
        @Html.HiddenFor(m => m.PackageId)
        @Html.HiddenFor(m => m.FeatureId)
    </li>
}
于 2013-01-20T03:36:25.530 に答える