ASP.NET Core MVC值绑定异常:Query提交后值不显示
问题原因及解决方案
这个问题的核心是ASP.NET Core在处理POST请求后返回视图时,会优先使用ModelState中的值(即表单提交的原始数据),而非你传入的模型对象的属性值。
具体到你的场景:
- 点击Query页面的查询按钮时,发起的是POST请求,表单里的
WorkNum输入框为空(因为是readonly且未输入内容),所以ModelState中会存入一个键为WorkNum、值为空的条目。 - 当你返回
Index视图并传入StaffInfoModel时,视图渲染asp-for="workNum"的输入框时,框架会优先检查ModelState。由于.NET模型绑定不区分大小写,WorkNum和workNum会被视为同一个键,因此会使用ModelState里的空值,覆盖你在模型中设置的"1010101010"。 - 而点击Privacy菜单是发起GET请求,没有表单数据提交,
ModelState为空,所以框架直接使用你传入的模型属性值,因此能正常显示。
解决办法
方法1:清除ModelState(适合简单场景)
在POST的Query动作中,返回视图前清除ModelState,让框架使用你传入的模型值:
[HttpPost] public IActionResult Query(QueryInfoModel model) { StaffInfoModel staff = new StaffInfoModel(); staff.workNum = "1010101010"; Debug.WriteLine(staff.workNum); ModelState.Clear(); // 清除ModelState,避免覆盖模型值 return View("Index", staff); }
方法2:使用PRG模式(Post-Redirect-Get,推荐的最佳实践)
PRG模式可以避免表单重复提交,同时也能解决ModelState的问题:
- 在POST动作中,将需要传递的值存入
TempData,然后重定向到GET动作:
[HttpPost] public IActionResult Query(QueryInfoModel model) { TempData["WorkNum"] = "1010101010"; return RedirectToAction("Index"); }
- 修改
Index动作,从TempData中取出值并传入模型:
public IActionResult Index() { StaffInfoModel staff = new StaffInfoModel(); if (TempData.ContainsKey("WorkNum")) { staff.workNum = TempData["WorkNum"].ToString(); } return View(staff); }
方法3:明确指定输入框的值(绕过ModelState)
在Index.cshtml的输入框中,直接指定value属性,强制使用模型的值:
<input type="text" asp-for="workNum" class="form-control col-sm-4" readonly="readonly" value="@Model.workNum" />
注意:这种方法会完全绕过ModelState的验证和值优先规则,适合不需要验证的场景。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

