Asp.net mvc 从未筛选的请求重定向到新视图

Asp.net mvc 从未筛选的请求重定向到新视图,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我想重定向到一个视图,但该视图正在[Authorize]属性启用的部分视图中加载 除了response.redirect之外还有别的吗 protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if (filterContext.HttpContext.Request.IsAuthenticated) { strin

我想重定向到一个视图,但该视图正在[Authorize]属性启用的部分视图中加载

除了response.redirect之外还有别的吗

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            string authUrl = this.redirectUrl; //passed from attribute NotifyUrl Property

            //if null, get it from config
            if (String.IsNullOrEmpty(authUrl))
            {
                authUrl = System.Web.Configuration.WebConfigurationManager.AppSettings["RolesAuthRedirectUrl"]; 
            }
            if (!String.IsNullOrEmpty(authUrl))
            {

                filterContext.HttpContext.Response.Redirect(authUrl); 
            }


        }

        base.HandleUnauthorizedRequest(filterContext);
    }




[AuthorizeUsers(Roles = "Administrator", NotifyUrl = "/CustomErrors/Error404")]
    public ActionResult addToCart(int ProductID, string Quantity)
    {

         ...
    }

看起来您正在使用AJAX调用调用由该Authorize属性修饰的控制器操作。如果用户未经授权,则希望完全重新加载页面

菲尔·哈克(Phil Haack)写了一篇非常好的博客文章,阐述了如何实现这一目标:

这个想法很简单。由于您向该控制器操作发出了AJAX请求,因此从部分中移出的唯一方法是使用javascript进行重定向。例如,您的AJAX代码可以检测到控制器操作是否返回401 HTTP状态代码,然后使用
window.location.href
重定向到登录页面:

$.ajax({
    url: '/protected',
    type: 'POST',
    statusCode: {
        200: function (data) {
            // Success
        },
        401: function (data) {
            // Handle the 401 error here.
            window.location.href = '/login'
        }
    }
});

这里唯一的困难是如何使标准Authorize属性返回
401
,而不是试图重定向到登录页面。Phil Haack举例说明了实现这一点的NuGet。

虽然这不能解决您的问题,但您不应该在MVC应用程序中执行Response.Redirect。相反,您应该将filterContext.Result设置为适当的ActionResult(重定向或重定向到Action)。哦,在我提交这个问题之前,我实际上实现了Phil Haack所写的第一部分(Ajax部分),但当我看到“我的解决方案”部分时,我不想继续阅读。xD我安装了他的Nuget软件包,它确实可以工作:)谢谢