MVC多个DropDownListFor

时间:2015-12-17 10:17:54

标签: c# asp.net-mvc

我从项列表中创建了一个表视图,每行都有一个DropDownListFor来从另一个列表中选择值。我想用相应的代码映射每个Name。如果某些名称已全部映射,如何显示一些具有所选值的DropdownLists? 谢谢。

array[2]

1 个答案:

答案 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是包含属性IDName的对象的集合。

更好的选择是为您的模型使用自定义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()方法正在使用SelectListAdditionalViewData传递给模板,该方法将正确生成集合中每个项目的html,而无需生成新的SelectList }&#39; S