我从一个项目列表中创建了一个表视图,并且在每一行中都有一个DropDownListFor来从另一个列表中选择值。我想用相应的代码映射每个名字。如果某些名称已被映射,如何使用所选的值显示一些DropdownLists?谢谢。
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Code)
</th>
</tr>
@foreach(var item in Model)
{
<tr>
<td>
@Html.DisplayFor(x => item.Name)
</td>
<td>
@Html.DropDownListFor(x => item.Code, (SelectList)ViewBag.SelectCodes)
</td>
</tr>
}
发布于 2015-12-17 11:05:57
首先,如果这个视图是提交给控制器方法的表单的一部分,那么您需要对模型使用for循环或EditorTemplate。foreach循环生成与模型无关的重复name属性,并生成无效的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()方法使用AdditionalViewData将SelectList传递给模板,该方法将为集合中的每个项正确生成html,而不必生成新的SelectList。
https://stackoverflow.com/questions/34332019
复制相似问题