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

ASP.NET 6中如何重定向到IActionResult的Post重载方法?

问题根本原因

RedirectToAction 默认返回HTTP 302/301重定向状态码,根据HTTP规范,浏览器收到这类重定向响应后,会以GET方法发起新的请求访问目标地址,因此无论怎么传参数都只会命中无参的GET版本Recreate方法,这是浏览器的默认行为,不是框架BUG。

可行解决方案

根据你的业务场景可以选择以下任意一种方案:

  • 方案1:直接调用方法(最简便,无需前端参与)
    不需要走重定向流程,直接在RecreateWithId中调用POST版本的Recreate方法返回结果即可:

    [Route( nameof(RecreateWithId))]
    public async Task<IActionResult> RecreateWithId(int id)
    {
        var result = await _studentYearlyResultRepository.GetByIdAsync( id );
        var modelObj = new StudentYearlyResultReCreateVm() {StudentId = result.StudentId , AcademicYearId = result.AcademicYearId};
        // 直接调用POST版本的动作方法,不走重定向
        return await Recreate(modelObj);
    }
    

    注意:如果POST版本的Recreate方法中有依赖POST请求上下文的逻辑(比如读取Form表单值、请求头专属字段),需要提前补全对应上下文数据,或者把业务逻辑抽成独立的公共方法供两个动作调用。

  • 方案2:前端自动提交表单(适用于必须走浏览器POST流程的场景)
    新增一个临时视图,页面加载时自动提交隐藏表单到POST版本的Recreate地址:

    1. 新增AutoPostRecreate.cshtml视图:
    @model StudentYearlyResultReCreateVm
    <form id="postForm" asp-action="Recreate" method="post">
        <input type="hidden" asp-for="StudentId" />
        <input type="hidden" asp-for="AcademicYearId" />
    </form>
    <script>
        document.getElementById('postForm').submit();
    </script>
    
    1. 修改RecreateWithId返回该视图:
    public async Task<IActionResult> RecreateWithId(int id)
    {
        // 原有查询构造model的逻辑不变
        return View("AutoPostRecreate", modelObj);
    }
    
  • 方案3:307重定向(仅适用于RecreateWithId本身是POST接口的场景)
    307/308状态码会保留原始请求的HTTP方法和请求体,如果调用RecreateWithId的请求本身就是POST,你可以指定重定向状态码为307:

    return RedirectToAction(nameof(Recreate), modelObj).WithStatusCode(StatusCodes.Status307TemporaryRedirect);
    

内容的提问来源于stack exchange,提问作者JOCKH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:36:06