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

如何在ASP.NET MVC中不通过路由在Action间传递数据?

解决重定向时传递复杂对象的问题

你遇到的问题根源在于:RedirectToAction 会发起302重定向,这是一个全新的HTTP请求。你传入的result.User对象会被自动拆解成路由参数或查询字符串,复杂对象无法通过这种方式完整传递,因此Home控制器的Index方法无法正确接收User对象。

下面提供两种无需通过路由参数传递数据的解决方案:

方案1:使用TempData传递对象

TempData适合在重定向的请求之间临时存储数据,默认基于Session实现,且读取后会自动清除(可通过Keep()保留)。

修改Users控制器的LoginCheck方法

public IActionResult LoginCheck(UserForm user)
{
    AuthUser auth = new AuthUser(_context);
    var result = auth.IsLoggedIn(user.Email, user.Password);
    if(result.isfound == false)
    {
        return NotFound();
    }
    result.User.IsAuth = true;

    // 序列化User对象并存入TempData
    var userJson = System.Text.Json.JsonSerializer.Serialize(result.User);
    TempData["LoggedInUser"] = userJson;

    return RedirectToAction("Index", "Home");
}

修改Home控制器的Index方法

public async Task<IActionResult> Index()
{
    // 从TempData中取出并反序列化User对象
    if (TempData["LoggedInUser"] is not string userJson)
    {
        return Unauthorized();
    }
    var user = System.Text.Json.JsonSerializer.Deserialize<User>(userJson);

    if(user == null || user.IsAuth == false)
    {
        return Unauthorized();
    }

    // 后续业务逻辑
}

方案2:使用Session存储用户信息

Session适合需要在多个请求间持久保留用户信息的场景,需先启用Session功能。

第一步:启用Session

在Program.cs中添加Session配置:

// 注册Session服务
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置会话超时时间
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

// 在中间件管道中启用Session(需放在UseRouting之后,UseAuthorization之前)
app.UseSession();

修改Users控制器的LoginCheck方法

public IActionResult LoginCheck(UserForm user)
{
    AuthUser auth = new AuthUser(_context);
    var result = auth.IsLoggedIn(user.Email, user.Password);
    if(result.isfound == false)
    {
        return NotFound();
    }
    result.User.IsAuth = true;

    // 序列化User对象并存入Session
    var userJson = System.Text.Json.JsonSerializer.Serialize(result.User);
    HttpContext.Session.SetString("LoggedInUser", userJson);

    return RedirectToAction("Index", "Home");
}

修改Home控制器的Index方法

public async Task<IActionResult> Index()
{
    // 从Session中取出并反序列化User对象
    var userJson = HttpContext.Session.GetString("LoggedInUser");
    if(string.IsNullOrEmpty(userJson))
    {
        return Unauthorized();
    }
    var user = System.Text.Json.JsonSerializer.Deserialize<User>(userJson);

    if(user == null || user.IsAuth == false)
    {
        return Unauthorized();
    }

    // 后续业务逻辑
}

注意事项

  • 若User对象包含敏感信息(如密码),存入TempData/Session前务必移除这些字段,避免数据泄露。
  • 确保User类可被序列化(无循环引用、无不可序列化的属性等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:31:05