【问题标题】:asp.net mvc: TempData and AuthorizeAttributeasp.net mvc:TempData 和 AuthorizeAttribute
【发布时间】:2010-02-03 17:53:38
【问题描述】:

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

场景 1:

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

场景 2:

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

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

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

【问题讨论】:

    标签: asp.net-mvc tempdata


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      [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);
      }
      

      【讨论】:

        猜你喜欢
        • 2015-10-20
        • 2014-01-26
        • 1970-01-01
        • 1970-01-01
        • 2019-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-20
        相关资源
        最近更新 更多