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

ASP.NET Core 7.0如何让RedirectToAction以Post传递路由参数?

解决方案:实现Post方式的"重定向"效果

HTTP标准里的重定向(3xx状态码)只能触发浏览器发送GET请求,因此RedirectToAction/RedirectToRoute这类原生重定向方法本质上无法直接实现Post传参。要达到类似"Post重定向"的效果,有两种常用方案:

1. 利用TempData传递参数后重定向

将需要传递的参数存入TempData,正常重定向到目标Action后,再从TempData中读取参数值。

示例代码:

// 源Action
public IActionResult SourceAction()
{
    // 存入待传递的参数
    TempData["UserId"] = 123;
    TempData["UserName"] = "JohnDoe";
    return RedirectToAction("TargetAction", "Home");
}

// 目标Action
public IActionResult TargetAction()
{
    // 读取参数
    if (TempData.TryGetValue("UserId", out var userIdObj) && int.TryParse(userIdObj.ToString(), out var userId))
    {
        var userName = TempData["UserName"]?.ToString();
        // 执行业务逻辑
    }
    return View();
}

注意:TempData默认依赖Session服务,需确保项目已启用Session配置。

2. 返回自动提交的表单视图

生成包含隐藏字段的表单,页面加载后自动通过Post方式提交到目标Action,模拟重定向的体验。

步骤1:创建通用Post重定向视图(如PostRedirect.cshtml)

@model PostRedirectModel

<form id="postRedirectForm" action="@Url.Action(Model.ActionName, Model.ControllerName)" method="post">
    @foreach (var param in Model.RouteValues)
    {
        <input type="hidden" name="@param.Key" value="@param.Value" />
    }
</form>

<script>
    // 页面加载后自动提交表单
    document.addEventListener('DOMContentLoaded', () => {
        document.getElementById('postRedirectForm').submit();
    });
</script>

步骤2:定义对应模型类

public class PostRedirectModel
{
    public string ActionName { get; set; }
    public string ControllerName { get; set; }
    public Dictionary<string, object> RouteValues { get; set; }
}

步骤3:在源Action中返回该视图

public IActionResult SourceAction()
{
    var model = new PostRedirectModel
    {
        ActionName = "TargetAction",
        ControllerName = "Home",
        RouteValues = new Dictionary<string, object>
        {
            { "UserId", 123 },
            { "UserName", "JohnDoe" }
        }
    };
    return View("PostRedirect", model);
}

// 目标Post Action
[HttpPost]
public IActionResult TargetAction(int userId, string userName)
{
    // 执行业务逻辑
    return View();
}

关于RedirectToRoute的补充

RedirectToRoute其实可以指定Action和Controller,只需将它们作为路由参数传入:

return RedirectToRoute(new { action = "TargetAction", controller = "Home", userId = 123 });

但它同样触发GET请求,无法解决Post传参问题,仅为路由参数的另一种写法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:45:01