ASP.NET MVC DropDownListFor 没有将列表中的选定数据设置为 true

ASP.NET MVC DropDownListFor doesn't set selected data to true in List

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

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

以上代码输出一个Htmlselect元素。但是 none 个选项被 select 编辑,即使 item.FilePath 与其中一个选项具有相同的值。

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

将模型更改为 IList<T> 并使用 for 循环并在每次迭代中使用设置 selectedValue[=26= 的构造函数生成新的 SelectList ]

@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