MVC编辑页面,与SelectList的父子关系

时间:2015-08-07 06:46:34

标签: c# asp.net-mvc

MVC5 EF6

我有一个Order对象,其中包含Status字段。 Order对象也有List<OrderLine>。这些OrderLine也有一个Status字段。 Order和OrderLine的状态不同。

我已设法按要求显示 - 我有一个订单状态下拉列表和一个<table>包含每个OrderLine的行 - 每个OrderLine都有一个下拉状态 - 这一切都正确显示正确的状态。我通过在Controller中创建selectLists来管理它。我遇到的一个问题是Status字段在OrderOrderLine中具有相同的名称“状态”。为了解决具有相同名称的ViewBag项目,我为Order状态执行了此操作:

ViewBag.OrderStatusID = new SelectList(db.Status.Where(s => s.SystemSectionID == Utils.Enums.SystemSection.ORDER), "StatusID", "UIStatus", order.StatusID);

这是OrderLine状态:

for (int x = 0; x < order.OrderLines.Count; x++)
{
    ViewData.Add("OrderLineStatusID_" + order.OrderLines.ElementAt(x).OrderLineID.ToString(), new SelectList(db.Status.Where(s => s.SystemSectionID == Utils.Enums.SystemSection.ORDER_LINE), "StatusID", "UIStatus", order.OrderLines.ElementAt(x).StatusID));
}

这会设置我的视图,确保所有状态'都显示所选选项。这是我的观点:

订购部分:

<div class="form-group">
        @Html.LabelFor(model => model.Status.UIStatus, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("OrderStatusID", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.StatusID, "", new { @class = "text-danger" })
        </div>
    </div>

OrderLine部分:@Html.EditorFor(model => model.OrderLines)

@using Heisenberg.Extensions
@model Heisenberg.Models.OrderLine

<tr>
@using (Html.BeginCollectionItem("OrderLines"))
{
    <td>
        @Html.HiddenFor(model => model.OrderLineID)
        @Model.ProdID
    </td>
    <td>
        @Model.Product.TitleProduct
    </td>
    <td>
        @Html.DropDownList("OrderLineStatusID_" + Model.OrderLineID.ToString(), null, htmlAttributes: new { @class = "form-control" })
    </td>
    <td>
        @Model.FulfilmentCentre.FulfilmentCentreName
    </td>
    <td>
        @Model.PostageModule.PostageModuleName
    </td>
    <td>
        @Model.MarketplaceSalePrice_Net
    </td>
    <td>
        @Model.MarkUpAmount_Net
    </td>
}
</tr>

当我点击保存时,会返回订单状态ID,因此下拉列表已成功绑定到模型,返回每个OrderLine但所有字段都是null,除非我用户HiddenFor仅返回当前OrderLine的状态,而不是下拉列表中实际选择的状态。

所以我猜,即使OrderLines正确显示正确的Status,下拉列表实际上并没有绑定到模型。我认为这是由于我对SelectList的命名,因为我知道MVC根据名称进行智能绑定 - 也许它在OrderLine对象中寻找字段“OrderLineStatusID_XXX”?

有谁能告诉我这方面的正确方法?

2 个答案:

答案 0 :(得分:0)

根据我对您的问题的理解,OrderLineStatusID值在保存时对控制器无效。 所以, 您可以使用name属性为下拉列表指定名称,如:

@ Html.DropDownList(&#34; OrderLineStatusID&#34; + Model.OrderLineID.ToString(),null,htmlAttributes:new {@class =&#34; form-control&#34;,@ name =&# 34; someName&#34;})

并使用名称作为控制器中的参数来获取值。

答案 1 :(得分:0)

最后我做了@StephenMueke建议并创建了一个包含我需要的selectLists的ViewModel - 稍微努力但是效果很好。