ASP.NET MVC DropDownListFor未在List中将所选数据设置为true

时间:2015-11-12 22:47:32

标签: c# asp.net asp.net-mvc html-helper html.dropdownlistfor

我有一个视图,其中有一个IEnumerable模型。我在foreach循环中使用DropDownListFor Html帮助器来输出下拉列表。但它不会将所选项目设置为true。代码如下:

@model IEnumerable<Example>
@foreach (var item in Model) {
    @Html.DropDownListFor(modelItem => item.FilePath, (IEnumerable<SelectListItem>)ViewBag.ConfigFiles, string.Empty, null)
}

上面的代码输出一个Html选择元素。但即使item.FilePath与其中一个选项具有相同的值,也不会选择任何选项。

1 个答案:

答案 0 :(得分:1)

这是在循环中使用DropDownListFor()的一个不幸的限制,您需要在每次迭代中生成一个新的SelectList。但是,使用foreach循环生成表单控件将不起作用。因此,它创建与您的模型没有关系的重复name属性将不会绑定,并且它还会生成重复的id属性,这些属性是无效的html。

将模型更改为IList<T>并使用for循环,并使用设置SelectList

的构造函数在每次迭代中生成新的selectedValue
@model IList<Example>
....
@for(int i = 0; i < Model.Count; i++)
{
  @Html.DropDownListFor(m => m[i].FilePath, new SelectList(ViewBag.ConfigFiles, "Value", "Text", Model[i].FilePath), string.Empty, null)
}

请注意,现在这会生成与您的模型绑定的name属性

<select name="[0].FilePath">....<select>
<select name="[1].FilePath">....<select>
.... etc

请注意,无需在控制器中创建IEnumerable<SelectListItem>。您可以将对象的集合分配给ViewBag

ViewBag.ConfigFiles = db.ConfigFiles;

并在视图中

new SelectList(ViewBag.ConfigFiles, "ID", "Name") // adjust 2nd and 3rd parameters to suit your property names