asp.net mvc:TempData和AuthorizeAttribute

时间:2010-02-03 17:53:39

标签: asp.net-mvc tempdata

作为this question的后续内容,我想知道我的TempData发生了什么。

情景1:

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

情景2:

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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);
}