Asp.net mvc 4 从操作筛选器属性重定向到特定控制器/操作方法

Asp.net mvc 4 从操作筛选器属性重定向到特定控制器/操作方法,asp.net-mvc-4,redirect,filter,Asp.net Mvc 4,Redirect,Filter,我已经做了一个过滤器来检查会话变量是否为空。 若它并没有值,那个么我重定向到登录页面。 此筛选器的代码(如果需要)- public class AuthorizerActionFilter : ActionFilterAttribute , IActionFilter { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.

我已经做了一个过滤器来检查会话变量是否为空。 若它并没有值,那个么我重定向到登录页面。 此筛选器的代码(如果需要)-

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请求首先进入这个过滤器。
这是我的问题,这次什么都没发生。我的意思是,当我调试AuthorizationFilter代码时,这个过滤器会一次又一次地运行。为什么会发生这种情况重定向控制器操作时有问题吗?

问题是,您将得到无限多的请求处理。当进行ajax调用时,过滤器将返回带有新位置的响应
UserLogin\UserLogin
(这是一个ajax调用)。如果你在你的过滤器中设置一个断点,你可以看到它将被无限次地命中

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

首先,对于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
,在这里检查status属性值,如果它是401(我们在操作过滤器中设置),则重定向到LoginUrl属性值

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

当只有ajax调用时,我必须检查会话是否有价值。如果它没有值,那么我必须重定向到UserLogin控制器和UserLogin操作。看看我的更新答案,它处理ajax请求场景。是否不可能直接从筛选器重定向任何控制器/操作???@DivyamSrivastava-想想它是如何工作的。如果您的ajax调用被重定向,它将处理一个新的ajax调用,该调用也将被重定向。摆脱此循环的唯一方法是拦截它,并在客户端执行完整页面(非ajax)重定向。你认为这种情况还会发生吗?页面不会基于ajax重定向进行重定向。它们是两种不同的语境