Asp.net mvc 从未筛选的请求重定向到新视图
我想重定向到一个视图,但该视图正在[Authorize]属性启用的部分视图中加载 除了response.redirect之外还有别的吗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
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软件包,它确实可以工作:)谢谢