我从项列表中创建了一个表视图,每行都有一个DropDownListFor来从另一个列表中选择值。我想用相应的代码映射每个Name。如果某些名称已全部映射,如何显示一些具有所选值的DropdownLists? 谢谢。
array[2]
答案 0 :(得分:0)
首先,如果此视图是您提交控制器方法的表单的一部分,那么您需要为模型使用for
循环或EditorTemplate
。您的foreach
循环生成了与您的模型无关的重复name
属性,并且还生成了无效的html的重复id
属性。
不幸的是,@Html.DropDownListFor()
在循环中呈现控件时的行为与其他帮助器的行为略有不同,并且在每次迭代中生成新的SelectList
并设置Selected
属性是必需的。使用for
循环,您的视图需要(模型必须为IList<T>
)
@for(int i = 0; i < Model.Count; i++)
{
@Html.DropDownListFor(m => m[i].Code, new SelectList(ViewBag.SelectCodes, "Value", "Text", Model[i].Code))
}
请注意,这是基于ViewBag.SelectCodes
已经是SelectList
,这不是必需的。它可能类似于new SelectList(ViewBag.SelectCodes, "ID", "Name", Model[i].Code)
,其中SelectCodes
是包含属性ID
和Name
的对象的集合。
更好的选择是为您的模型使用自定义EditorTemplate
。假设您的模型为MyModel.cs
,则在/Views/Shared/EditorTemplates/MyModel.cshtml
中创建部分视图(模板名称必须与班级名称匹配)
@model MyModel
<tr>
<td>@Html.DisplayFor(m => m.Name)</td>
<td>@Html.DropDownListFor(m => m.Code, (SelectList)ViewData["SelectCodes"])</td>
</tr>
然后在主视图中
@model IEnumerable<MyModel>
....
<table>
<thead>
....
</thead>
<tbody>
@Html.EditorFor(m => m, new { SelectCodes = ViewBag.SelectCodes })
</tbody>
</table>
EditorFor()
方法正在使用SelectList
将AdditionalViewData
传递给模板,该方法将正确生成集合中每个项目的html,而无需生成新的SelectList
}&#39; S