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重定向进行重定向。它们是两种不同的语境