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

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,可返回一个包含自动提交表单的临时视图:

  1. 新建视图(比如命名为_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>
  1. 在CurrentWork方法中返回该视图:
[HttpPost]
public async Task<IActionResult> CurrentWork()
{
    var postModel = new ViewModels();
    // 填充postModel数据...
    
    return View("_PostRedirect", postModel);
}

浏览器加载这个视图后会自动提交Post请求到Index,地址栏也会同步更新为Index的URL。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:20:29