ASP.NET Core 5 MVC中如何从Post动作重定向至同控制器的Post动作
解决ASP.NET Core 5 MVC中Post动作重定向到同控制器Post动作的问题
首先明确:你用RedirectToAction("Index")跳转到Get版本的Index是HTTP协议的正常表现——重定向本质是浏览器收到302响应后自动发起GET请求,所以永远匹配不到标注[HttpPost]的Index方法。
下面给两种实用的解决方案:
方案1:直接调用Post版本的Index方法(推荐)
不需要浏览器跳转,直接在服务器端复用Post Index的业务逻辑,还能直接传递参数:
[HttpPost] public async Task<IActionResult> CurrentWork() { // 准备要传递给Index的ViewModels参数 var postModel = new ViewModels(); // 填充postModel的属性数据... // 直接调用同控制器的Post版本Index方法 return await Index(postModel); }
这种方式的优势:
- 不需要额外视图或前端脚本
- 模型验证、Action过滤器等逻辑都会正常执行
- 减少一次浏览器请求,性能更优
方案2:通过自动提交表单实现浏览器Post跳转(需更新地址栏URL时用)
如果必须让浏览器地址栏显示Index的URL,可返回一个包含自动提交表单的临时视图:
- 新建视图(比如命名为
_PostRedirect.cshtml):
@model ViewModels <form method="post" asp-action="Index"> <!-- 用隐藏字段传递模型参数 --> @foreach (var prop in Model.GetType().GetProperties()) { <input type="hidden" name="@prop.Name" value="@prop.GetValue(Model)" /> } <!-- 自动提交脚本 --> <script> document.forms[0].submit(); </script> </form>
- 在CurrentWork方法中返回该视图:
[HttpPost] public async Task<IActionResult> CurrentWork() { var postModel = new ViewModels(); // 填充postModel数据... return View("_PostRedirect", postModel); }
浏览器加载这个视图后会自动提交Post请求到Index,地址栏也会同步更新为Index的URL。
内容的提问来源于stack exchange,提问作者Marcos Mendez
相关产品推荐
相关产品推荐

