我在循环中有三个dropdownlistfor,它没有显示DB中的正确值。它们始终默认为第一个条目。我检查并仔细检查了数据库,并确认它应该是列表中的第二个。该列表也正确创建。我错过了什么?
@foreach (CustomerMeasurementProfile oProfile in Model.Customer.CustomerMeasurementProfiles.Where(m => m.DeletedDate == null))
{
<div class="valuesforoneprofile form-group form-group-tight col-md-2">
<div class="col-md-11" >
@Html.Hidden(string.Format("Customer.CustomerMeasurementProfiles[{0}].Id", i), oProfile.Id)
@Html.Hidden(string.Format("Customer.CustomerMeasurementProfiles[{0}].CustomerId", i), oProfile.CustomerId)
@Html.TextBox(string.Format("Customer.CustomerMeasurementProfiles[{0}].Name", i), oProfile.Name, new { @class = "form-control input-sm" })
</div>
<div class="col-md-11" style="text-align:center">
@Html.CheckBox(string.Format("DeleteProfiles[{0}]", i), Model.DeleteProfiles[i])
</div>
<div class="col-md-11" style="padding-top:4px;">
@Html.DropDownListFor(m => oProfile.BodyTypeShoulderId, new SelectList(Model.BodyTypeShoulders, "Id", "Name"), new { @class = "form-control input-sm-select" })
</div>
<div class="col-md-11" style="padding-top:4px;">
@Html.DropDownListFor(m => oProfile.BodyTypePostureId, new SelectList(Model.BodyTypePosture, "Id", "Name"), new { @class = "form-control input-sm-select" })
</div>
<div class="col-md-11" style="padding-top:4px;">
@Html.DropDownListFor(m => oProfile.BodyTypeChestId, new SelectList(Model.BodyTypeChest, "Id", "Name"), new { @class = "form-control input-sm-select" })
</div>
答案 0 :(得分:3)
如果要设置模型中的选定值。你需要这样做:
@Html.DropDownListFor(m => oProfile.BodyTypeShoulderId,
new SelectList(Model.BodyTypeShoulders,
"Id",
"Name",
oProfile.BodyTypeShoulderId),
new { @class = "form-control input-sm-select" })
上面的代码会将下拉选择值设置为当前模型对象BodyTypeShoulderId
DropDownListFor
的第一个参数告诉我,在表单上下拉选择的值将使用在那里设置的Model属性进行映射(我们正在传递m => oProfile.BodyTypeShoulderId
),但这不会设置选定的值。 / p>
要设置所选值,您必须使用SelectList
object selectedValue
传递{{1}}第四个参数
答案 1 :(得分:0)
不幸的是,@Html.DropDownListFor()
在循环中渲染控件时的行为与其他助手的行为略有不同。对于单个对象
@Html.DropDownListFor(m => oProfile.BodyTypeShoulderId, new SelectList(Model.BodyTypeShoulders, "Id", "Name"))
可以正常工作(如果BodyTypeShoulderId
的值与其中一个选项的值匹配,那么将选择该选项)。 Ehsan在循环中使用它时已经展示了一个工作,但是你的代码中还有一些其他问题,不过你的许多属性都不会正确地回发到集合,因为你使用了foreach
循环而不是for
循环(生成重复的name
和id
属性)。您还会在循环的每次迭代中生成一个新的SelectList
,效率不高。
您可以使用EditorTemplate
解决这些问题和下拉选择问题。假设属性CustomerMeasurementProfiles
是CustomerMeasurementProfiles
的类型,那么
CustomerMeasurementProfiles.cshtml(将其添加到Views/Shared/EditorTemplates
或Views/YourController/EditorTemplates
)
@model CustomerMeasurementProfiles
@Html.HiddenFor(m => m.ID)
@Html.HiddenFor(m => m.CustomerId)
....
@Html.DropDownListFor(m => m.BodyTypeShoulderId, (SelectList)ViewData["shoulders"])
....
在视图模型中,添加SelectList
的属性以及要显示的项目的过滤集合
IEnumerable<CustomerMeasurementProfiles> ActiveCustomerMeasurementProfiles { get; set; }
public SelectList BodyTypeShoulderList { get; set; }
....
并在控制器中分配这些值
然后在主视图中
@using (Html.BeginForm())
{
...
@Html.EditorFor(m => m.ActiveCustomerMeasurementProfiles, new { shoulders = Model.BodyTypeShoulderList })
...
将@Html.EditorFor()
与集合一起使用将正确命名控件(并正确选择正确的选项),在回发后,ActiveCustomerMeasurementProfiles
现在将正确填充其所有属性。