ASP.NET Core MVC回发时无法绑定新模型问题咨询
ASP.NET Core MVC POST后视图未显示更新模型值的问题解决
问题原因
这是ASP.NET Core MVC的默认行为,和浏览器无关。当处理POST请求时,框架会将用户提交的表单值存入ModelState字典;返回视图时,asp-for标签助手会优先读取ModelState中的旧提交值,而非你修改后的模型对象属性值,因此即便你在代码中更新了newPerson.Name,页面仍会显示用户最初输入的内容。
解决方法
方法一:清除ModelState
在修改模型数据后,调用ModelState.Clear()清除存储的旧提交值,让视图绑定更新后的模型属性:
[HttpPost] public IActionResult Save(Person newPerson) { newPerson.Name = newPerson.Name + " Added"; ModelState.Clear(); // 清除旧的提交值 return View("Index", newPerson); }
方法二:使用PRG模式(Post-Redirect-Get)
这是符合HTTP规范的最佳实践,既能解决视图值不更新的问题,还能避免用户刷新页面重复提交表单的问题。处理完POST请求后,重定向到GET类型的Index方法,并传递更新后的模型数据:
[HttpPost] public IActionResult Save(Person newPerson) { newPerson.Name = newPerson.Name + " Added"; TempData["UpdatedPerson"] = newPerson; // 用TempData传递临时数据 return RedirectToAction("Index"); } public IActionResult Index() { // 优先读取TempData中的更新后数据,没有则用默认值 Person p = TempData["UpdatedPerson"] as Person ?? new Person { Id = 1, Age = 5, Name = "Sooo" }; return View(p); }
注意:如果
Person类是自定义复杂类型,需要确保它可序列化才能存入TempData,可以给类添加[Serializable]特性,或者改用Session传递数据。
内容的提问来源于stack exchange,提问作者V Mat
相关产品推荐
相关产品推荐

