ASP.NET Core路由ID覆盖ViewModel的ID值,如何避免该问题?
问题原因与解决方案
原因
这是ASP.NET Core的ModelState机制导致的:当你通过Duplicate/14访问时,路由中的id=14会被自动添加到ModelState中。尽管你在代码里把model.ID设为了0,但Html.HiddenFor渲染时会优先读取ModelState中存储的旧值(也就是14),而非模型当前的属性值。[FromForm]无效是因为这是GET请求,参数来源于路由而非表单提交。
解决方法
以下几种方式都能解决这个问题:
- 清除ModelState中对应字段:在设置
model.ID = 0之后,手动移除ModelState里的ID条目,让视图优先使用模型的当前值:if (copy) { model.ID = 0; ModelState.Remove("ID"); // 关键代码 } return View("Edit", model); - 手动渲染隐藏字段:绕过
Html.HiddenFor,直接写隐藏字段标签,直接使用模型的ID值:<input type="hidden" name="ID" value="@Model.ID" /> - 重定向到Edit动作:在
DuplicateAsync里不直接调用EditAsync,而是用重定向,让路由重新生成参数(适合需要更新URL的场景):[HttpGet("Duplicate/{id:int}")] public IActionResult DuplicateAsync(int id) { return RedirectToAction(nameof(EditAsync), new { id = id, copy = true }); }
内容的提问来源于stack exchange,提问作者jstuardo
相关产品推荐
相关产品推荐

