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

ASP.NET MVC Razor提交选中项至控制器时列表为空求助

问题原因及解决方案

你的问题出在表单控件的命名不符合ASP.NET MVC模型绑定规则,导致控制器无法解析出clients列表。

核心问题

用foreach循环渲染列表时,Html.CheckBoxFor(modelItem => item.Selected)生成的控件名称是item.Selected,这种格式无法被模型绑定器识别为集合的一部分。ASP.NET MVC要求集合类的表单控件名称必须遵循集合名[索引].属性名的格式(比如clients[0].Selected),才能正确绑定到IEnumerable<Client>。


解决方案1:使用for循环渲染列表

步骤1:修改视图的模型类型

把视图的模型从IEnumerable<MyApp.Models.Client>改为List<MyApp.Models.Client>(因为IEnumerable没有索引器,无法用for循环遍历):

@model List<MyApp.Models.Client>
@using (Html.BeginForm("SendCommand", "Command", FormMethod.Post))
{
    <input type="text" name="command" />
    <button type="submit">Submit</button>

    <table class="table">
        <thead>
            <tr>
                <th>@Html.DisplayNameFor(model => model[0].Selected)</th>
                <th>@Html.DisplayNameFor(model => model[0].ClientId)</th>
                <th>@Html.DisplayNameFor(model => model[0].Name)</th>
                <th>@Html.DisplayNameFor(model => model[0].Alive)</th>
            </tr>
        </thead>
        <tbody>
            @for (int i = 0; i < Model.Count; i++)
            {
                <tr>
                    <td>
                        @Html.CheckBoxFor(m => m[i].Selected)
                        <!-- 必须提交唯一标识及其他属性,确保模型绑定能匹配到对应Client -->
                        @Html.HiddenFor(m => m[i].ClientId)
                        @Html.HiddenFor(m => m[i].Name)
                        @Html.HiddenFor(m => m[i].Alive)
                    </td>
                    <td>@Html.DisplayFor(m => m[i].ClientId)</td>
                    <td>@Html.DisplayFor(m => m[i].Name)</td>
                    <td>@Html.DisplayFor(m => m[i].Alive)</td>
                </tr>
            }
        </tbody>
    </table>
}

步骤2:修改控制器的Index方法

确保传递给视图的是List<Client>类型:

public IActionResult Index()
{
    var clients = Clients.GetClients().ToList(); // 转成List
    return View(clients);
}

解决方案2:使用编辑器模板(EditorTemplate)

这种方式更优雅,适合复杂模型的列表渲染:

步骤1:创建编辑器模板

在Views/Shared/EditorTemplates文件夹下新建Client.cshtml文件(如果没有EditorTemplates文件夹就手动创建):

@model MyApp.Models.Client
<tr>
    <td>
        @Html.CheckBoxFor(m => m.Selected)
        @Html.HiddenFor(m => m.ClientId)
        @Html.HiddenFor(m => m.Name)
        @Html.HiddenFor(m => m.Alive)
    </td>
    <td>@Html.DisplayFor(m => m.ClientId)</td>
    <td>@Html.DisplayFor(m => m.Name)</td>
    <td>@Html.DisplayFor(m => m.Alive)</td>
</tr>

步骤2:修改主视图

@model List<MyApp.Models.Client>
@using (Html.BeginForm("SendCommand", "Command", FormMethod.Post))
{
    <input type="text" name="command" />
    <button type="submit">Submit</button>

    <table class="table">
        <thead>
            <tr>
                <th>@Html.DisplayNameFor(model => model[0].Selected)</th>
                <th>@Html.DisplayNameFor(model => model[0].ClientId)</th>
                <th>@Html.DisplayNameFor(model => model[0].Name)</th>
                <th>@Html.DisplayNameFor(model => model[0].Alive)</th>
            </tr>
        </thead>
        <tbody>
            <!-- 自动渲染每个Client的编辑器模板,并生成正确的索引命名 -->
            @Html.EditorFor(m => m)
        </tbody>
    </table>
}

效果说明

两种方案都会生成类似以下格式的表单控件,模型绑定器就能正确识别并组装成IEnumerable<Client>:

<input name="clients[0].Selected" type="checkbox" ... />
<input name="clients[0].ClientId" type="hidden" value="1" ... />
<input name="clients[1].Selected" type="checkbox" ... />
<input name="clients[1].ClientId" type="hidden" value="2" ... />

内容的提问来源于stack exchange,提问作者alexddf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:33:33