Dropdownlistfor将不会显示正确的选择

时间:2014-11-04 18:17:08

标签: html5 asp.net-mvc-4 razor

我在循环中有三个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>

2 个答案:

答案 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循环(生成重复的nameid属性)。您还会在循环的每次迭代中生成一个新的SelectList,效率不高。

您可以使用EditorTemplate解决这些问题和下拉选择问题。假设属性CustomerMeasurementProfilesCustomerMeasurementProfiles的类型,那么

CustomerMeasurementProfiles.cshtml(将其添加到Views/Shared/EditorTemplatesViews/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现在将正确填充其所有属性。