【问题标题】:Redirect To Specific Controller/Action method From Action Filter Attribute从动作过滤器属性重定向到特定的控制器/动作方法
【发布时间】:2016-11-21 06:18:01
【问题描述】:

我制作了一个过滤器,它检查会话变量是否为空。 如果它没有价值,那么我会重定向到登录页面。 这个过滤器的代码如果喜欢-

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 过滤器代码时,这个过滤器会一次又一次地运行。为什么会发生 Redirecting the Controller-Action 有什么问题吗?

【问题讨论】:

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


    【解决方案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;
       }
    });
    

    【讨论】:

    • 只有当有 ajax 调用时,我才必须检查 Session 是否有一些价值。如果它没有值,那么我必须重定向到 UserLogin 控制器和 UserLogin 操作。
    • 看看我更新的处理 ajax 请求场景的答案
    • 不能直接从过滤器重定向任何控制器/动作吗?
    • @DivyamSrivastava - 想想它是如何工作的。如果您的 ajax 调用被重定向,它将处理一个新的 ajax 调用,该调用也将被重定向。摆脱此循环的唯一方法是拦截它并在客户端执行整页(非 ajax)重定向。你认为这还会如何发生?该页面不会基于 ajax 重定向进行重定向。它们是两种不同的上下文
    猜你喜欢
    • 2011-07-24
    • 2010-12-02
    • 1970-01-01
    • 2013-09-29
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多