C# ActionFilter无法使用AJAX调用
我有一个对DataTable的AJAX调用,该DataTable正在调用控制器中返回类型为JsonResult的方法。如果用户的会话已过期,我将收到一个JSON错误警报,站点将挂起。我试图使用ActionFilter在处理请求之前检查用户的会话是否已过期。当方法返回类型为ActionResult时,它起作用。但是,当返回类型为JsonResult时,我看到了错误并挂起。在跟踪时,我看到正在调用ActionFilter,代码运行良好,但它不会像应该的那样将用户重定向到登录页面。有没有一种方法可以中止服务器端的AJAX调用并按预期重定向用户 动作过滤器C# ActionFilter无法使用AJAX调用,c#,ajax,asp.net-mvc,action-filter,C#,Ajax,Asp.net Mvc,Action Filter,我有一个对DataTable的AJAX调用,该DataTable正在调用控制器中返回类型为JsonResult的方法。如果用户的会话已过期,我将收到一个JSON错误警报,站点将挂起。我试图使用ActionFilter在处理请求之前检查用户的会话是否已过期。当方法返回类型为ActionResult时,它起作用。但是,当返回类型为JsonResult时,我看到了错误并挂起。在跟踪时,我看到正在调用ActionFilter,代码运行良好,但它不会像应该的那样将用户重定向到登录页面。有没有一种方法可以中
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
if (ctx.Session != null)
{
if (ctx.Session.IsNewSession)
{
string cookieHeaders = ctx.Request.Headers["Cookie"];
if ((null != cookieHeaders) && (cookieHeaders.IndexOf("ASP.NET_SessionId") >= 0))
{
filterContext.Result = new RedirectResult("~/Account/Login");
return;
}
}
}
base.OnActionExecuting(filterContext);
}
我们可以检查请求是否为Ajax,然后返回json结果,并在客户端检查服务器是否返回错误重定向到登录页面,如:
if ((null != cookieHeaders) && (cookieHeaders.IndexOf("ASP.NET_SessionId") >= 0))
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult
{
Data = new {Error = "UnAutorized", Url = Url.Action("Login","Account")},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
return;
}
else
{
filterContext.Result = new RedirectResult("~/Account/Login");
return;
}
}
现在,对于普通请求,它将重定向到登录页面,对于ajax调用,它将重新发送json响应,其中包含未经授权的错误消息和url,应该重定向到哪里,然后在客户端,我们可以重定向如下:
window.location.href = response.Url;
我不知道有一个请求方法!我对JsonResult做了一些调整,但这解决了我的问题!非常感谢你,伊桑!我为这个问题争论了两天。