TempData 不会持续传递给第二个操作

TempData does not persist on pass to second action

我正在尝试通过几个动作来传递 TempData,但我无法让它持续超过一个传递。我已经在 Whosebug 上阅读了大量关于此的问题,但我就是无法让他们的解决方案发挥作用。我知道 TempData 只针对一个重定向持续存在,但建议 .Keep() 或 .Peek() 应该允许它在另一个重定向中持续存在。不幸的是,这对我没有用。我还尝试从第二个重定向重新分配 TempDataTempData 的直接硬编码,但它仍然无法通过。我显然错过了一些东西。我的代码:

//First redirect
 public ActionResult Index(int? userId, int? reportingYear)
    {
        if (Session["State"] == null)
        {
            TempData["Timeout"] = "Your session has timed out. Please login to continue.";
            return RedirectToAction("LogOff", "Account");
        }
    }

//Second redirect
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
public ActionResult LogOff()
    {
        //Delete the application cookie and clear session variables
        var cookies = Request.Cookies;
        List<string> tempCookies = new List<string>();

        foreach (string cookie in cookies)
        {
            if (cookie.ToString() != "quailCoord")
            {
                tempCookies.Add(cookie);
            };
        }

        foreach (string cookie in tempCookies)
        {
            HttpCookie deleteCookie = Request.Cookies[cookie];
            deleteCookie.Expires = DateTime.Now.AddDays(-1);
            Response.Cookies.Add(deleteCookie);
        }

        Session.Abandon();
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        
        //When checking that the key exists, it does and enters the if statement to keep the data
        if (TempData.ContainsKey("Timeout")
        {
            TempData.Keep("Timeout");
        }
        return RedirectToAction("Login");
    }

//Third action
public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        //It does not find any TempData keys
        if (TempData.ContainsKey("Timeout"))
        {
            ViewBag.Timeout = TempData["Timeout"] as string;
        }
        return View();
    }

我也尝试过用这些方法代替 TempData.Keep("Timeout") 方法:

TempData.Peek("Timeout")

TempData["Timeout"] = TempData["Timeout"]

TempData["Timeout"] = "Your session has timed out. Please login to continue."

None 这些方法传递给 Login() 操作。 TempData 在进入该操作时始终为空。调试时,当我越过 return RedirectToAction("Login") 行时,TempData 中的计数变为 0。我错过了什么?删除 cookie 有问题吗?

因为 TempData 会将数据存储在 Session 对象中,该对象可能会为您存储 SessionId in cookie, if you delete that server will create another SessionId(对象)而不是原始对象。

因此,如果您想对多项操作保持 TempData,我们可能需要从 cookie 中保持 SessionId 值。

根据您的代码,我们可以尝试添加 判断是否检查cookie key 如果是则不删除cookie。

foreach (string cookie in cookies)
{
    if (cookie.ToString() != "quailCoord" && cookie.ToString() != "ASP.NET_SessionId")
    {
        tempCookies.Add(cookie);
    };
}