2010-02-03 67 views
1

作为this question的后续,我想知道我的TempData发生了什么。asp.net mvc:TempData和AuthorizeAttribute

方案1:在

  • 用户

    • 用户登录提供电子邮件地址
    • 用户接收与验证代码上的验证URL
    • 用户点击
    • 用户已通过认证
    • 成功电子邮件msg通过验证行动中的TempData设置显示

    方案2:在

  • 用户

    • 用户登录提供电子邮件地址
    • 用户登出/超时
    • 用户接收电子邮件,其中验证代码上的验证URL
    • 用户点击
    • 用户验证
    • 成功msg不显示通过温度在验证操作中设置的数据

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

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

  • 回答

    6

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

    您可能会考虑直接将其放入会话中,而不是会话的TempData前端。只要会议活着,它应该仍然在那里。

    +0

    貌似会议它是... – chris 2010-02-03 18:10:26

    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); 
    } 
    
    相关问题