ASP.NET Core 2(VS2017)银行主数据编辑ModelState.IsValid始终为false问题
兄弟,我太懂这种ModelState突然失效的憋屈了!结合你用ASP.NET Core 2+VS2017做银行主数据编辑的场景,大概率是这几个坑在搞鬼:
主键ID没正确传递到后端
编辑时后端必须知道要修改哪条数据,但很多人会忽略在编辑视图里把ID作为隐藏字段传递。检查你的编辑视图,有没有加类似这样的代码:<input type="hidden" asp-for="Id" />或者用Html辅助类写法:
@Html.HiddenFor(m => m.Id)如果ID没传,模型绑定直接失败,ModelState自然会无效。
模型验证约束未满足
光知道ModelState无效没用,得看具体错在哪!在你的编辑Post Action里加这段代码,调试时就能看到所有错误细节:if (!ModelState.IsValid) { var errorDetails = ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage)); // 把errorDetails放到调试窗口查看,就能精准定位哪个字段没通过验证 }比如模型里某个字段加了
[Required]但编辑时没赋值,或者[StringLength(20)]但输入了超过20位的内容,都会触发验证失败。数据类型不匹配
银行主数据里肯定有金额、日期这类敏感字段,前端传递的格式和后端模型类型不兼容就会炸。比如模型里是DateTime类型,但前端传了个"2024/13/01"这种无效日期,或者decimal类型传了带中文的字符串,都会导致绑定失败,ModelState直接变红。编辑Action的参数绑定被限制
检查你的编辑Post Action是不是加了[Bind]属性,却把必要字段排除了?比如:[HttpPost] public IActionResult Edit([Bind("BankName,Address")] BankMainData model)这种情况下ID字段没被包含进来,模型绑定自然失败。要么去掉
[Bind](如果业务安全允许的话),要么把ID加进绑定列表:[Bind("Id,BankName,Address")]。视图控件命名和模型属性不匹配
ASP.NET Core的模型绑定是区分大小写的!比如模型里是BankCode,但视图里的输入框name写成了bankcode,或者手动改了控件name属性,都会导致字段绑定失败,进而让ModelState无效。
先按上面的步骤排查,尤其是先输出ModelState的错误详情,这是最快定位问题的办法!
内容的提问来源于stack exchange,提问作者Fire

