MVC绑定嵌套列表 [英] MVC Binding nested list

查看:289
本文介绍了MVC绑定嵌套列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有三个实体包,特征与PackageFeature如下:

套餐:结果
包标识(PK)结果
PackageTitle

功能特性:
FEATUREID(PK)结果
FeatureTitle

PackageFeature:结果
PackageFeatureId(PK)结果
包标识(FK)结果
功能(FK)结果
数量

我有一个类型为包,并允许用户编辑对导致源$ C ​​$ C以下的PackageFeature实体数量领域的MVC视图,我怎么在控制器接这个吗?我试过 [绑定(包括=PackageFeature)名单,LT;包装及GT;包列表< PackageFeature> packageFeature 但是当我在调试器中查看前我得到的(4)列表项的正确数量,但他们的PackageIds均为0,因此他们有0项PackageFeature列表,后者还生产的4个项目,因为有8 PackageFeatures这是不正确列表 - 。然而PackageIds是正确的,其他一切被设置为0 /空

 <形式的行动=/包/功能/方法=后>< H3>基本< / H3 GT&;<输入数据-VAL =真正的数据-VAL-数=...数据-VAL-所需=...NAME =[0] .PackageId类型=隐藏值=2 />< UL>
    <立GT;
        <跨度>无。 / SPAN>分类(如管道工)LT的;
        <输入数据-VAL =真正的数据-VAL-数=...NAME =[0] .PackageFeature [8] .Quantity类型=文本值=1/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[0] .PackageFeature [8] .PackageFeatureId类型=隐藏VALUE =9/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[0] .PackageFeature [8] .PackageId类型=隐藏VALUE =2/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[0] .PackageFeature [8] .FeatureId类型=隐藏VALUE =9/>
    < /李>
    <立GT;
        <跨度>无。的地区(例如悉尼市)LT; / SPAN>
        <输入数据-VAL =真正的数据-VAL-数=...NAME =[0] .PackageFeature [9] .Quantity类型=文本值=1/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[0] .PackageFeature [9] .PackageFeatureId类型=隐藏VALUE =10/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[0] .PackageFeature [9] .PackageId类型=隐藏VALUE =2/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[0] .PackageFeature [9] .FeatureId类型=隐藏VALUE =10/>
    < /李>
< / UL>< H3>青铜与LT; / H3 GT&;<输入数据-VAL =真正的数据-VAL-数=...数据-VAL-所需=...NAME =[1] .PackageId类型=隐藏值=3 />< UL>
    <立GT;
        <跨度>无。 / SPAN>分类(如管道工)LT的;
        <输入数据-VAL =真正的数据-VAL-数=...NAME =[1] .PackageFeature [8] .Quantity类型=文本VALUE =2/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[1] .PackageFeature [8] .PackageFeatureId类型=隐藏VALUE =19/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[1] .PackageFeature [8] .PackageId类型=隐藏VALUE =3/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[1] .PackageFeature [8] .FeatureId类型=隐藏VALUE =9/>
    < /李>
    <立GT;
        <跨度>无。的地区(例如悉尼市)LT; / SPAN>
        <输入数据-VAL =真正的数据-VAL-数=...NAME =[1] .PackageFeature [9] .Quantity类型=文本VALUE =4/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[1] .PackageFeature [9] .PackageFeatureId类型=隐藏VALUE =20/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[1] .PackageFeature [9] .PackageId类型=隐藏VALUE =3/>
        &所述;输入数据-VAL =真的数据-VAL-号码=...数据-VAL-需要=...名称=[1] .PackageFeature [9] .FeatureId类型=隐藏VALUE =10/>
    < /李>
< / UL><! - 上面再为2个包重复 - >

编辑:

用于上述生成

code:

包/ Features.cshtml:

  @model名单< RenovateDTL.Package>@ {
    ViewBag.Title =包功能;
    布局=〜/查看/共享/ _OneColumnLayout.cshtml
}< H2>封装特点和LT; / H>@using(Html.BeginForm())
{
    @ Html.DisplayForModel()    <按钮式=提交>保存更改LT; /按钮>
}

包/ DisplayTemplates / Package.cshtml:

  @model RenovateDTL.Package< H3> @ Model.Title< / H3 GT&;@ Html.HiddenFor(M = GT; m.PackageId)< UL>
    @ Html.EditorFor(M = GT; m.PackageFeature)
< / UL>

/Packages/EditorTemplates/PackageFeature.cshtml:

  @model RenovateDTL.PackageFeature@using RenovateDTL.Enum@if(Model.FeatureId ==(INT)FeatureId.NumberOfCategoriesAllowed || Model.FeatureId ==(INT)FeatureId.NumberOfRegions)
{
    <立GT;
        <跨度> @ Model.Feature.Title< / SPAN>
        @ Html.TextBoxFor(M = GT; m.Quantity)
        @ Html.HiddenFor(M = GT; m.PackageFeatureId)
        @ Html.HiddenFor(M = GT; m.PackageId)
        @ Html.HiddenFor(M = GT; m.FeatureId)
    < /李>
}


解决方案

我这样做是因为在PackageFeature.cshtml模板周围的工作,但我我最好preFER一个更精简外的任何─如果任何人有一个盒子的解决方案。

  @model RenovateDTL.PackageFeature@ {
    ViewContext.ViewData.TemplateInfo.HtmlField preFIX =PackageFeature [+ Model.PackageFeatureId +];
}@if(Model.FeatureId ==(INT)FeatureId.NumberOfCategoriesAllowed || Model.FeatureId ==(INT)FeatureId.NumberOfRegions)
{
    <立GT;
        <跨度> @ Model.Feature.Title< / SPAN>
        <输入类型=隐藏的名字=PackageFeature.IndexVALUE =@ Model.PackageFeatureId/>
        @ Html.TextBoxFor(M = GT; m.Quantity)
        @ Html.HiddenFor(M = GT; m.PackageFeatureId)
        @ Html.HiddenFor(M = GT; m.PackageId)
        @ Html.HiddenFor(M = GT; m.FeatureId)
    < /李>
}

I have three entities Package, Feature and PackageFeature as follows:

Package:
PackageId (PK)
PackageTitle

Feature:
FeatureId (PK)
FeatureTitle

PackageFeature:
PackageFeatureId (PK)
PackageId (FK)
Feature (FK)
Quantity

I have an MVC view that is typed to "Package" and allows the user to edit the Quantity field on the PackageFeature entity resulting in the source code below, how do I pick this up in the controller? I've tried [Bind(Include = "PackageFeature")]List<Package> package and List<PackageFeature> packageFeature but when I view the former in the debugger I get the correct number of list items (4) but their PackageIds are all 0 and consequently they have a PackageFeature list of 0 items, the latter also produces a list of 4 items which is incorrect as there are 8 PackageFeatures - however the PackageIds are correct, everything else is set to 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-->

EDIT:

Code used to generate above:

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>
}

Packages/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>
}

解决方案

I did this as a work around in the PackageFeature.cshtml template but I'm I'd prefer a more streamlined out-of-the-box solution if anyone has one.

@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>
}

这篇关于MVC绑定嵌套列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆