从操作过滤器属性

时间:2016-07-18 15:06:16

标签: asp.net-mvc-4 redirect filter

我创建了一个过滤器,其中会话变量是否为空。 如果它没有值,那么我重定向到Login页面。 此过滤器的代码,如果 -

public class AuthorizerActionFilter : ActionFilterAttribute , IActionFilter
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            if (HttpContext.Current.Session != null)
            {
                if (HttpContext.Current.Session["UserInfo"] == null)
                {
                   filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary {{ "Controller", "UserLogin" },
                                                      { "Action", "UserLogin" } });
                }
            }
        }
        base.OnActionExecuting(filterContext);
    }
}

我将此过滤器注册到Global.asax中 -

GlobalFilters.Filters.Add(new AuthorizerActionFilter());

我的应用程序中的每个请求都首先进入此过滤器。 当我第一次运行我的应用程序这个过滤器运行两次并打开登录页面时,它没有从过滤器重定向,因为它不是ajax请求。 我填写了登录凭证,当我点击登录时,ajax请求首先进入此过滤器。 这是我的问题,这次没有任何反应。我的意思是当我调试AuthorizerActionFilter过滤器代码时,这个过滤器一次又一次地运行。为什么会这样?重定向控制器动作是否有问题?

1 个答案:

答案 0 :(得分:1)

问题是,您将获得无限数量的请求处理。当您进行ajax调用时,您的过滤器将返回具有新位置UserLogin\UserLogin的响应(并且它是ajax调用)。如果你在过滤器中放置一个断点,你会发现它会被无限次击中!

您应该更新您的客户&服务器端代码执行非ajax重定向到UserLogin。

首先,对于ajax请求,您应该考虑发送json响应。

 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    if (filterContext.HttpContext.Request.IsAjaxRequest())
    {
        if (HttpContext.Current.Session != null)
        {
            if (HttpContext.Current.Session["UserInfo"] == null)
            {

              var url = new UrlHelper(filterContext.Controller.ControllerContext
                                      .RequestContext).Action("UserLogin", "UserLogin");
              filterContext.HttpContext.Response.StatusCode = 401;
              filterContext.Result = new JsonResult { Data = new { LoginUrl = url };
            }
         }
     }
     base.OnActionExecuting(filterContext);
}

在您的javascript中,有一个全局ajaxComplete,您可以在其中检查状态属性值,如果它是401(我们在操作过滤器中设置),则重定向到LoginUrl属性值。

$(document).ajaxComplete(function (a, xhr, c) {
   if (xhr.status === 401) {
         var d = $.parseJSON(xhr.responseText);
         window.location.href = d.LoginUrl;
   }
});