1

作为这个问题的后续,我想知道我的 TempData 发生了什么。

场景一:

  • 用户登录
  • 用户提供电子邮件地址
  • 用户收到带有验证码的电子邮件
  • 用户点击验证 url
  • 用户已验证
  • 成功消息通过验证操作中设置的 TempData 显示

场景二:

  • 用户登录
  • 用户提供电子邮件地址
  • 用户注销/超时
  • 用户收到带有验证码的电子邮件
  • 用户点击验证 url
  • 用户已验证
  • 成功消息未通过验证操作中设置的 TempData 显示

现在,我看不到用户登录验证的理由。在场景 1 中,我在 TempData 中放置了一条“Success”消息,并返回 RedirectToAction(“Index”)。索引操作有一个 AuthorizeAttribute - 如果他们没有登录,他们将被重定向到登录屏幕(单独的控制器)。

我希望登录屏幕显示我的消息,但在这种情况下 TempData 似乎被清除了。我是否误解了 TempData 生命周期?它仅适用于同一控制器中的请求吗?

4

2 回答 2

6

问题是,如果用户未登录,AuthorizeAttribute 将在循环中引入另一个重定向。您将用户重定向到另一个操作,然后,如果用户未登录,AuthorizeAttribute 会将他们重定向到登录页面。TempData 只存在一个请求周期,因此额外的重定向(请求)正在清空它,并且它在登录页面上不可用。

您可能会考虑将其直接放在 Session 中,而不是 TempData 前端的 Session 中。只要会话存在,它就应该仍然存在。

于 2010-02-03T17:57:11.550 回答
3

[Authorize]引入了一个额外的重定向,它清除了TempData(Tvanfosson 已经解释了细节)。因此,为此,您可以在重定向到的方法上使用标志,例如

return RedirectToAction("Confirm", new { status = "Success!" });

(假设您声明了以下路线和操作方法:)

routes.MapRoute("Confirmation",
    "Account/Confirm/{status}", 
    new { controller = "Account", action = "Confirm", status = "" });

public ActionResult Confirm(string status)
{
    return View(status);
}
于 2010-02-03T18:04:07.773 回答