为什么调用 RedirectToAction 之后 TempData 为空?

Zhi Lv - MSFT 32,021 信誉分 Microsoft 供应商
2024-03-04T08:17:54.9666667+00:00

我正在为一些非常奇怪的行为而苦苦挣扎。我的 TempData 在测试情况下工作正常。

public async Task<IActionResult> Test()
{
    TempData["TEST"] = "HELLO"; 
    return RedirectToAction("Test2");
}
 [HttpGet]
 public IActionResult Test2()
 {
     var tempData = TempData["TEST"]; //TempData is available here...
     return View();
 }

但是在我代码的另一部分中,重定向后 TempData 为 null:

[HttpGet]
public async Task<IActionResult> DoSomething(int? u, string? e, string? p, int? n)
{
    if (u is null || e is null || n is null)
    {
        return RedirectToAction("Index", "Home");
    }
    else
    {
        var user = await _userManager.FindByIdAsync(u.ToString());
        if (user is null)
        {
            return RedirectToAction("Index", "Home");
        }
        else if (user is not null && !user.Email!.Equals(e, StringComparison.CurrentCultureIgnoreCase))
        {
            return RedirectToAction("Index", "Home");
        }
        else if (user is not null && p is null) 
        {
            TempData["UserID"] = user.Id.ToString();
            return RedirectToAction("Preview", "Home", new { id = notification.UploadID });
        }
    }
}
public async Task<IActionResult> Preview(int id)
{
    var userId = TempData["UserID"]; // This is always NULL!
    if (userId is null)
    {
        return RedirectToAction("Index", "Home", new { area = "" });
    }
    else
    {
         // do stuff here.
    }
}

令我感到困惑的是,TempData 和 Session 都在其他操作/视图中工作,但这个操作/视图却没有。 我刚刚发现了一个可能是罪魁祸首的差异。只有当我通过电子邮件中的链接加载网站时,才会发生问题。在网站加载之前,TempData 和 Session 似乎都不可用,然后单击另一个链接以点击另一个操作/视图。 如果我先加载网站,然后从电子邮件中获取链接并将其输入地址栏,则 TempData 和 Session 都可以工作。 知道这里发生了什么吗?

为什么会出现这个问题呢?该如何解决呢?

注意: 此问题总结整理于:TempData null after RedirectToAction

ASP.NET Core
ASP.NET Core
.NET Framework 中一套用于生成 Web 应用程序和 XML Web 服务的技术。
22 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. XuDong Peng-MSFT 10,176 信誉分 Microsoft 供应商
    2024-03-05T02:35:46.4866667+00:00

    你好,

    我试图重现您的问题,cookie(会话 cookie/TempData Cookie)可能会被您的场景中的 samesite 策略阻止 您可以检查如何在 program.cs 中配置 TempData Cookie:

    builder.Services.Configure<CookieTempDataProviderOptions>(options =>
    {
        options.Cookie.Name = "TEMPDATA";
        //you have to avoid setting SameSiteMode.Strict here
        options.Cookie.SameSite = SameSiteMode.Lax;
      
    });
    

    您可以在浏览器中检查cookie:

    用户图像


    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助