ASP.NET Core 3.1 MVC中asp-for隐藏字段整数值显示为0的问题
ASP.NET Core 3.1 MVC 分部视图整数属性隐藏字段值异常的原因及解决
这个问题的核心原因是ASP.NET Core的asp-for标签助手会优先从ModelState中读取值,而非直接使用传递给视图的Model实例的值。
具体场景分析
在编辑流程中,如果之前存在过表单提交(比如用户提交时验证失败),ModelState会保留当时的表单值。对于int类型的IdClient和IdGroup来说,若之前提交时没有正确赋值,ModelState中对应的键值会是默认值0。当你通过Ajax请求返回分部视图时,若未清除ModelState,asp-for标签助手会优先读取ModelState里残留的0,而非你新传递的Model中大于0的有效值。
而字符串类型的Mode和TempFile不受影响,是因为它们属于引用类型,默认值为null,若之前的ModelState中没有对应的残留值,标签助手就会直接使用Model实例的当前值。
解决方法
有两种可靠的解决方式:
- 清除
ModelState后返回分部视图
在控制器返回分部视图前,调用ModelState.Clear(),强制标签助手从Model实例读取值:
ModelState.Clear(); return PartialView("_PartialDetail", model);
- 显式指定
value属性
就是你已经使用的临时解决方法,直接通过@Model.IdClient给value赋值,覆盖asp-for从ModelState读取的值:
<input asp-for="IdClient" value="@Model.IdClient" type="hidden" /> <input asp-for="IdGroup" value="@Model.IdGroup" type="hidden" />
补充说明
asp-for标签助手完全可以用于隐藏字段,不存在“不允许使用”的限制,问题本质是ModelState的优先级机制导致的取值冲突。
内容的提问来源于stack exchange,提问作者TheMixy
相关产品推荐
相关产品推荐

