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

ASP.NET MVC 提交List到Controller为空,如何修复绑定且保留LINQ用法?

问题原因

ASP.NET MVC的集合模型绑定要求提交的表单项name属性必须符合参数名[索引].属性名的格式,你当前用foreach循环变量生成的表单项name为contact.Email,不符合绑定规则,因此Controller收到的集合参数为null。

修复方案(保留原有LINQ写法)

你可以直接用LINQ的Select重载获取遍历索引,手动指定表单项的name属性为符合绑定规则的格式,同时补充提交其他需要绑定的字段即可:

第一步:调整视图代码

<h4>Order Acknowledgement Contact(s)</h4>
@{
    // 先统计AK类型的数量,用于BK类型的索引偏移
    var akContacts = Model.Where(c => c.Type == "AK").Take(3).ToList();
    int akCount = akContacts.Count;
}
@foreach (var (contact, index) in akContacts.Select((item, idx) => (item, idx)))
{
    <div class="form-group">
        <div class="col-md-10">
            @* 提交其他必要字段,根据你的CustomerContact类调整 *@
            @Html.Hidden($"customerContacts[{index}].Id", contact.Id)
            @Html.Hidden($"customerContacts[{index}].Type", contact.Type)
            @* 手动指定EditorFor生成的name属性 *@
            @Html.EditorFor(c => contact.Email, new { 
                htmlAttributes = new { 
                    @class = "form-control",
                    Name = $"customerContacts[{index}].Email" 
                } 
            })
            @Html.ValidationMessageFor(c => contact.Email, "", new { @class = "text-danger" })
        </div>
    </div>
}

<h4>Shipping Acknowledgement Contact(s)</h4>
@foreach (var (contact, index) in Model.Where(c => c.Type == "BK").Take(3).Select((item, idx) => (item, idx + akCount)))
{
    <div class="form-group">
        <div class="col-md-10">
            @Html.Hidden($"customerContacts[{index}].Id", contact.Id)
            @Html.Hidden($"customerContacts[{index}].Type", contact.Type)
            @Html.EditorFor(c => contact.Email, new { 
                htmlAttributes = new { 
                    @class = "form-control",
                    Name = $"customerContacts[{index}].Email" 
                } 
            })
            @Html.ValidationMessageFor(c => contact.Email, "", new { @class = "text-danger" })
        </div>
    </div>
}

注意事项

  • 如果你的CustomerContact类还有其他需要绑定的属性,参照上面的写法补充对应的隐藏字段即可
  • 如果你修改了Controller中接收参数的名称,需要同步替换代码中customerContacts前缀为新的参数名
  • 该方案完全保留了你原有Where、Take等LINQ用法,不需要调整业务过滤逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:54:02