MVC5 EF6
我有一个Order
对象,其中包含Status
字段。 Order
对象也有List<OrderLine>
。这些OrderLine
也有一个Status
字段。 Order和OrderLine的状态不同。
我已设法按要求显示 - 我有一个订单状态下拉列表和一个<table>
包含每个OrderLine
的行 - 每个OrderLine
都有一个下拉状态 - 这一切都正确显示正确的状态。我通过在Controller中创建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));
}
这会设置我的视图,确保所有状态'都显示所选选项。这是我的观点:
订购部分:
<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”?
有谁能告诉我这方面的正确方法?
答案 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 - 稍微努力但是效果很好。