Jquery 会话超时时的Ajax调用

Jquery 会话超时时的Ajax调用,jquery,ajax,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,Jquery,Ajax,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,总之,如果在会话超时时进行ajax调用,我将尝试重定向到登录页面。 以下是我到目前为止所做的 为所有操作定义操作筛选器 public class AuthenticateFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActio

总之,如果在会话超时时进行ajax调用,我将尝试重定向到登录页面。 以下是我到目前为止所做的

为所有操作定义操作筛选器

public class AuthenticateFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            var routeDataSet = filterContext.RouteData;
            if (LoginUser.LoginAdministrator == null)
            {
                //if the useinfo stored in session is timeout. 
                if (routeDataSet != null
                    && routeDataSet.Values["controller"] != null
                    && routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
                    && routeDataSet.Values["action"] != null
                    && routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
                {
                    //if it is login action itself.let it be. don't do anything.


                }
                else
                {
                    //redirect to login page.
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } });
                }
            }
        }
    }
这适用于会话超时时的非ajax操作调用。但是对于ajax调用。它不能重定向到登录页面,只能返回一个html页面字符串(似乎是登录页面的源html代码),而不是真正的结果。 假设我们有这样的代码

function ajaxGetLogDetail(logId) {
        var sUrl = "/LogDetail/index?logId=" + logId;
        $.ajax({
            cache: false,
            type: "GET",
            async: false,
            url: sUrl,
            success: function (result) {
                //please note result is html string. not the really result.
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });
    }
有谁能帮我提供一些解决这个问题的线索吗?谢谢

已更新

基于Mohsin和Dave的回答(谢谢你们两位),这里是最终的解决方案。请复习一下。谢谢

public class AuthenticateFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            var routeDataSet = filterContext.RouteData;
            if (LoginUser.LoginAdministrator == null)
            {

                //&& routeDataSet != null && routeDataSet.Values["controller"] != null
                //&& !routeDataSet.Values["controller"].ToString().ToLower().Equals("login") && routeDataSet.Values["action"] != null
                //&& !routeDataSet.Values["action"].ToString().ToLower().Equals("login") && !filterContext.HttpContext.Request.HttpMethod.ToLower().Equals("get"))
                if (routeDataSet != null
                    && routeDataSet.Values["controller"] != null
                    && routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
                    && routeDataSet.Values["action"] != null
                    && routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
                {



                }
                else
                {
                    if (filterContext.HttpContext.Request.IsAjaxRequest())
                    {
                        filterContext.Result = new JsonResult
                        {
                            Data = new
                            {
                                ErrorMessage = "SystemSessionTimeOut"
                            },
                            JsonRequestBehavior = JsonRequestBehavior.AllowGet
                        };
                    }
                    else
                    {
                        filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } });
                    }
                }
            }
        }
    }
在客户端:

function ajaxGetLogDetail(logId) {
        var sUrl = "/LogDetail/index?logId=" + logId;
        $.ajax({
            cache: false,
            type: "GET",
            async: false,
            url: sUrl,
            success: function (result) {
                if (result.ErrorMessage=="SystemSessionTimeOut")
                {
                   windows.location="/Login/Login";
                } 
                else
                {
                   //...  
                }
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });
    }

Ajax调用不能返回任何类型的重定向。在内核中,AJAX调用只返回字符串。没有执行重定向的引擎

不过,您可以执行客户端重定向。如果会话已超时,并且在客户端,控制器方法返回false:

     if !(routeDataSet != null
         && routeDataSet.Values["controller"] != null
         && routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
         && routeDataSet.Values["action"] != null
         && routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
      {
        return Json(new { success = false, message = errorMessage });
      }
在AJAX
error
函数中:

        error: function (xhr) {
            alert(xhr.responseText);
            window.location='/Login/Login';
        }

旁注:您的目的地是“/Login/Login”还是“/Account/Login”

在从上述过滤器重定向后,您是否可以在视图中使用IsAjaxRequest检查请求类型并做出相应的响应好主意,您是指
filterContext.HttpContext.request.IsAjaxRequest
?谢谢。嗨,莫辛,戴夫给了我更多的细节。因此,唯一的方法是执行客户端重定向。我认为这是你的意思。“Ajax调用不能返回任何类型的重定向。在核心部分,Ajax调用只返回字符串。没有任何类型的引擎可以执行重定向。”但是谁说要执行重定向,您可以调用RedirectToAction,并在查看时切换页面的呈现。这也可以帮助您在登录后轻松重定向到最后一个网页,因为您可以完全控制请求,并且可以绕过常规导航实践Hi,Mohsin,我想我可以通过以下方式重定向到登录后的最后一个网页:window.location='/login/login?lasturl='+lasturl;lastUrl存储当前的查看url。嗨,Dave,你能检查一下我更新的内容吗。谢谢