You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(优雅适配任意集合类型)

  1. 在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>
  1. 主视图中用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:47:32