2 xi de xi_de 于 2016.01.29 18:58 提问

mvc4中ajax请求重定向问题

在mvc4中我有一个过滤器 在每一个action前都会先调用一次,里面的方法是用来判断用户是否登录如果是程序发出的请求还好可以重定向到登录页面 但ajax 的请求就无法重定向,我现在有一个解决方法但是 还是不完美

这是我的过滤器,如果是ajax的请求就在浏览器头部设置一个标记

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {


           if (UserInfo == null)
            {
               //如果是Ajax  请求的  要特殊处理
                if (HttpContext.Request.IsAjaxRequest())
                {
                    //添加头部信息 前端会有ajax回调 判断
                    Response.AddHeader("sessionstatus", "timeout");

                    return;
                }
                else
                {
                    //正常的请求
                    filterContext.Result = new RedirectToRouteResult(
                       "Default",
                       new RouteValueDictionary(
                           new
                           {
                               controller = "Login/Login",
                               action = "Login"
                           }));
                }
            }
            else
            {
                base.OnActionExecuting(filterContext);
            }


        }

如果标记是ajax的就 在我的js 里设置一段全局的 js代码 如果是标记的 就用js 来定向 登录页面


/**
 * 设置未来(全局)的AJAX请求默认选项
 * 主要设置了AJAX请求遇到Session过期的情况
 */
$.ajaxSetup({
    type: 'POST',
    complete: function (xhr, status) {
        var sessionStatus = xhr.getResponseHeader('sessionstatus');
        if (sessionStatus == 'timeout') {

            //var yes = confirm('由于您长时间没有操作, session已过期, 请重新登录.');
            //if (yes) {
                window.location.href = '/Login/Login/Login';
           // }
        }
    }
});


那么问题来了 我这里 设置完标记后 js也重定向了 但是 我请求的 query 这个查询方法 必须要 全部执行完 才重新定向登录页面

下面这个 方法会执行

 public string Query()
        {
            //string BeginDate = Request.Form["BeginDate"];
            //string EndDate = Request.Form["EndDate"];
            string MemberNO = Request.Form["MemberNo"];
            string MemberName = Request.Form["MemberName"];
            int pageIndex = Request.Form["page"] != "" ? Convert.ToInt32(Request.Form["page"]) : 0;
            int pageSize = Request.Form["rows"] != "" ? Convert.ToInt32(Request.Form["rows"]) : 0;

            StringBuilder WhereCode = new StringBuilder(" CompanyID = "+this.UserInfo.CompanyID);
            //if (!string.IsNullOrEmpty(BeginDate))
            //{
            //    WhereCode.Append(" AND  (RegisterDate >= '" + BeginDate + "')");
            //}
            //if (!string.IsNullOrEmpty(EndDate))
            //{
            //    WhereCode.Append(" AND  (RegisterDate <= '" + EndDate + "')");
            //}
            if (!string.IsNullOrEmpty(MemberNO))
            {
                WhereCode.Append(" AND MemberNo ='" + MemberNO + "'");
            }
            if (!string.IsNullOrEmpty(MemberName))
            {
                WhereCode.Append(" AND MemberName like '%" + MemberName + "%'");
            }
            WhereCode.Append(" AND (Status = 'A') AND (MemberType = '01')");

            MemberService memberInfo = new MemberService();
            string json = memberInfo.GetMemberInfo(WhereCode.ToString(), pageIndex, pageSize);
            return json;
        }

不是 谁有好的解决方案 如果我是ajax 的请求 就让请求 不继续 执行 直接重定向

2个回答

showbo
showbo   Ds   Rxr 2016.01.30 13:33

complete中判断返回内容失败包含你登录页面的特殊字符,是就是超时了用js跳转

easyui请求页面拦截跳转超时提示

xi_de
xi_de 然后 执行 我 $.ajaxSetup 里 的complete
接近 2 年之前 回复
xi_de
xi_de 有声明办法 中断我 ajax 访问的方法
接近 2 年之前 回复
showbo
showbo 回复xi_de: js无法判断是否超时,必须由服务器端判断
接近 2 年之前 回复
xi_de
xi_de 这样可以吗 我发现它的 执行顺序 是先把我 ajax 访问的 方法先执行了 然后再跑到 我声明的 $.ajaxSetup 里 这样 应该还是要先执行我的 访问方法后 在执行 后面的 这样还是 执行了 我的操作方面
接近 2 年之前 回复
showbo
showbo 回复xi_de: 然后弹出一个层给用户登录,用ajax发送数据验证什么的
接近 2 年之前 回复
showbo
showbo 回复xi_de: 你可以提示超时,不需要location.href进行跳转。
接近 2 年之前 回复
xi_de
xi_de 那这样的话 比如我的一个 新增 修改 删除 我要先执行了 才可以 重定向 这样是不是 不太好
接近 2 年之前 回复
showbo
showbo 回复xi_de: 肯定要执行啊,不执行你怎么知道超时
接近 2 年之前 回复
xi_de
xi_de 这个 我看了下 这个好像还是 要先执行完 我请求的方法后 然后再去 complete 中判断执行重定向 我想让他 不执行我请求的方法 直接重定向
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.01.29 21:37

ajax没法服务器重定向,你需要在你的js客户端得到返回的httpstate,如果是301/302,再发新的请求到新的地址。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!