You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:42:11