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地址:- 新增
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>- 修改
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
相关产品推荐
相关产品推荐

