ASP.NET Core 8表单回发后Id隐藏字段未更新正确值问题
问题原因及解决方案
这个问题的核心是ASP.NET Core的ModelState优先机制:当表单回发后,asp-for标签助手会优先从ModelState中读取字段值,而非你传入视图的最新Model对象。
你提交表单时,原始的Id=0已经被存入ModelState,哪怕后续你更新了Model的Id值,标签助手还是会沿用ModelState里的旧值渲染隐藏字段,所以显示的始终是0。
三种解决方法(按推荐程度排序)
1. 使用PRG模式(Post/Redirect/Get,推荐)
这是ASP.NET Core处理表单提交的最佳实践,既能避免重复提交,也从根源上解决ModelState的问题。修改Post方法的成功分支:
else { TempData["Result"] = "Saved successfully"; // 重定向到Get方法,重新获取最新数据 return RedirectToAction(nameof(AddOrUpdate), new { id = result.Data.Id }); }
浏览器会发起新的Get请求,此时ModelState是空的,视图会从数据库获取的最新Model中读取正确的Id值。
2. 清除ModelState后返回视图
如果不想用重定向,可以在返回视图前清除ModelState,让标签助手读取Model的新值:
else { TempData["Result"] = "Saved successfully"; // 清除ModelState,确保标签助手使用Model的新值 ModelState.Clear(); return View(result.Data); }
3. 手动指定隐藏字段的值(临时方案,不推荐)
放弃asp-for的自动绑定,直接手动设置value属性:
<input type="hidden" name="Id" value="@Model.Id" />
这种方式会丢失asp-for带来的模型验证、名称自动匹配等特性,仅适合临时测试场景。
内容的提问来源于stack exchange,提问作者Bahadir Emre
相关产品推荐
相关产品推荐

