ASP.NET中如何用@Html.CheckBox/CheckBoxFor收集类值并传递至控制器
ASP.NET列表型ViewModel表单提交绑定问题解决方法
问题根源
你当前用foreach遍历集合渲染表单时,生成的表单元素name属性没有带索引标识,ASP.NET的ModelBinder无法识别这种格式,导致提交后控制器只能接收到模型的默认值(Id为0、名称为空),无法获取有效数据。
解决方案
方法一:使用for循环(适用于IList类型ViewModel)
如果你的ViewModel是IList<vistaEjercicio_MODEL>,用for循环遍历会自动生成带索引的name属性,让ModelBinder正确绑定集合:
<table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model[0].IdDepartamento) </th> <th> @Html.DisplayNameFor(model => model[0].NombreDep) </th> <th></th> </tr> </thead> <tbody> @for (int i = 0; i < Model.Count; i++) { <tr> <td> @Html.DisplayFor(modelItem => modelItem[i].IdDepartamento) <!-- 隐藏域保存Id,提交时传递值 --> @Html.HiddenFor(modelItem => modelItem[i].IdDepartamento) </td> <td> @Html.DisplayFor(modelItem => modelItem[i].NombreDep) <!-- 隐藏域保存部门名称 --> @Html.HiddenFor(modelItem => modelItem[i].NombreDep) </td> <td> @Html.CheckBoxFor(modelItem => modelItem[i].IsCheck) </td> </tr> } </tbody> </table> <input type="submit" value="Ver empleados" />
方法二:使用EditorTemplate(优雅适配任意集合类型)
- 在
Views/Shared/EditorTemplates目录下创建vistaEjercicio_MODEL.cshtml视图文件:
@model vistaEjercicio_MODEL <tr> <td> @Html.DisplayFor(m => m.IdDepartamento) @Html.HiddenFor(m => m.IdDepartamento) </td> <td> @Html.DisplayFor(m => m.NombreDep) @Html.HiddenFor(m => m.NombreDep) </td> <td> @Html.CheckBoxFor(m => m.IsCheck) </td> </tr>
- 主视图中用
EditorFor渲染整个集合:
<table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.First().IdDepartamento) </th> <th> @Html.DisplayNameFor(model => model.First().NombreDep) </th> <th></th> </tr> </thead> <tbody> @Html.EditorFor(model => model) </tbody> </table> <input type="submit" value="Ver empleados" />
关键注意事项
- 必须添加
HiddenFor控件:DisplayFor仅渲染文本,不会生成表单提交项,隐藏域才能将IdDepartamento和NombreDep的值传递到控制器。 - 控制器Action需接收集合类型参数:
[HttpPost] public ActionResult VerEmpleados(IList<vistaEjercicio_MODEL> model) { // 筛选选中项 var selectedDepartments = model.Where(item => item.IsCheck).ToList(); // 后续业务逻辑 return View(); }
内容的提问来源于stack exchange,提问作者user21153032
相关产品推荐
相关产品推荐

