.NET Core 3.1+EF Core提交表单时Id为0或控制器接收参数为空问题
问题排查与解决方法
优先排查步骤
- 先抓提交的表单数据格式:打开Chrome开发者工具「网络」标签,找到提交的表单请求,查看Form Data中的键名是否完全符合
[i].属性名的格式(比如[0].Id、[0].Comments、[1].Id),确认没有序号断裂、前缀错误、格式错乱的问题。 - 查看模型绑定错误详情:在控制器方法首行加断点,检查
ModelState.IsValid的值,如果为false,遍历ModelState.Values.SelectMany(v => v.Errors)就能直接拿到具体的绑定失败原因,比如某一行的Id类型不匹配、值非法等,能直接定位到第41行的具体问题。 - 验证序号连续性:如果你实际业务代码的for循环里有条件跳过了部分行的渲染,会导致生成的字段序号不连续(比如直接从
[0]跳到[2]),ASP.NET Core默认的列表绑定遇到断号就会终止,最终可能返回null。
对应解决方案
方案1:修复断号绑定问题
如果存在序号不连续的情况,在每一行的渲染代码中加一行Index隐藏域,强制框架接受非连续序号:
@for (var i = 0; i < Model.Count; i++) { <input type="hidden" name="Index" value="@i" /> <textarea asp-for="@Model[i].Comments" rows="5" cols="75"></textarea> <input asp-for="@Model[i].Id" type="hidden" /> }
方案2:显式声明绑定来源
给控制器参数加[FromForm]特性,避免框架匹配绑定来源出错:
public IActionResult Update([FromForm] List<EvaluationsModel> evalRows) { _dostuffWith(evalRows); return Redirect(toGet); }
方案3:调整绑定上限(如果确认是字段数超限)
.NET Core 3.1默认表单值数量上限为1024,集合绑定上限为1024,如果你的实际字段数超过限制,在Startup.cs的ConfigureServices方法中修改配置:
// 调整表单提交值数量上限 services.Configure<FormOptions>(options => { options.ValueCountLimit = 2048; // 可根据实际业务调整大小 }); // 调整集合模型绑定上限 services.AddMvc(options => { options.MaxModelBindingCollectionSize = 2048; });
方案4:校验第41行数据合法性
单独测试提交前40行数据,如果能绑定成功,提交到41行就失败,直接检查第41行的Id值是否为合法的数字、是否超出你定义的Id类型范围、Comments内容是否有特殊字符破坏了表单格式。
内容的提问来源于stack exchange,提问作者NovaDev
相关产品推荐
相关产品推荐

