OnActionExecuting导致无限重定向处理会话超时

时间:2013-02-21 10:50:09

标签: c# asp.net asp.net-mvc-3

如果用户会话超时,我试图在我的BaseController中使用OnActionExecuting来处理重定向到LogOn屏幕。然而,即使在我登录之前它也会导致无限重定向 - 任何人都可以建议如何绕过它吗?

所以在我的Base控制器中,我有以下内容:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (SessionManager.Instance().GetUser() == null) 
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary {
                    { "Controller", "Home" },
                    { "Action", "LogOn" }
            });
        }

        base.OnActionExecuting(filterContext);
    }

所以基本上我有一个可以获取/设置用户等的Session Manager类 - 我知道GetUser中的问题也是null,因为只有在验证了LogOn之后才使用我的SetUser方法设置它。

但是,不要让我的其他控制器中的每个方法都有一个检查:

public ActionResult SomeOtherMethod()
{
     if(SessionManager.Instance().GetUser() != null)
     {

             //Go Do Useful View stuff

     }
     else
     {
          //Redirect To Logon
     }

}

我想在Base Controller中使用OnActionExcuting。但是因为它在LogOn页面上运行(因为它应该)我得到infinte redierct因为GetUser总是为空?

还有更好的办法吗

1 个答案:

答案 0 :(得分:3)

也许你可以尝试这样的事情:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    string controllerName = filterContext.Controller.GetType().Name;
    string actionName = filterContext.ActionDescriptor.ActionName;

    if (SessionManager.Instance().GetUser() == null ) 
    {
        if(!controllerName.Equals(typeof(HomeController).Name,StringComparison.InvariantCultureIgnoreCase)
        || !actionName .Equals("LogOn",StringComparison.InvariantCultureIgnoreCase)))
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary {
                { "Controller", "Home" },
                { "Action", "LogOn" }
        });
    }

    base.OnActionExecuting(filterContext);
}