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
相关产品推荐
相关产品推荐

