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
字段在Order
和OrderLine
中具有相同的名称"状态"。为了避免我的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对象?
谁能告诉我正确的方法?
根据我对你的问题的理解,OrderLineStatusID值在保存时将为空。所以,您可以使用name属性为下拉列表指定一个名称,例如:
@Html。DropDownList("OrderLineStatusID" + Model.OrderLineID.ToString(), null, html属性:new {@class =" form-control", @name="someName"})
,并使用名称作为控制器的参数来获取值
最后,我按照@StephenMueke的建议创建了一个ViewModel,其中包含了我需要的selectLists——这需要更多的努力,但效果很好。