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

本文关键字:父子关系 SelectList 编辑页面 MVC | 更新日期: 2023-09-27 18:06:44

MVC5 EF6

我有一个具有Status字段的Order对象。Order对象也有一个List<OrderLine>。这些OrderLine也有一个Status字段。Order和OrderLine的状态是不同的。

我已经成功地按要求显示-我有一个下拉菜单的订单状态和<table>包含一行每个OrderLine -每个OrderLine有一个下拉菜单的状态-这一切都显示正确显示正确的状态。我通过在控制器中创建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));
}

这将设置我的视图,确保所有Status'都显示所选选项。这是我的视图:

订单部分:

<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 part: @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正确地显示了正确的状态,下拉菜单实际上并没有绑定到模型。我认为这是由于我的SelectList的命名,因为我知道MVC做智能绑定的基础上的名称-也许它寻找字段"OrderLineStatusID_XXX"在OrderLine对象?

谁能告诉我正确的方法?

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

根据我对你的问题的理解,OrderLineStatusID值在保存时将为空。所以,您可以使用name属性为下拉列表指定一个名称,例如:

@Html。DropDownList("OrderLineStatusID" + Model.OrderLineID.ToString(), null, html属性:new {@class =" form-control", @name="someName"})

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

最后,我按照@StephenMueke的建议创建了一个ViewModel,其中包含了我需要的selectLists——这需要更多的努力,但效果很好。