Javascript 本地成功活动之前的全球ajaxSuccess活动

Javascript 本地成功活动之前的全球ajaxSuccess活动,javascript,jquery,asp.net,ajax,asp.net-mvc,Javascript,Jquery,Asp.net,Ajax,Asp.net Mvc,我有一个ASP MVC应用程序,它允许用户通过jQuery ajax调用向div添加多个局部视图 jQuery("#AddNew").click(function () { $.ajax({ url: this.href, cache: false, success: function (html) { jQuery("#DivId").append(html); } }); retu

我有一个ASP MVC应用程序,它允许用户通过jQuery ajax调用向div添加多个局部视图

jQuery("#AddNew").click(function () {
    $.ajax({
        url: this.href,
        cache: false,
        success: function (html) {
            jQuery("#DivId").append(html);
        }
    });
    return false;
});
问题在于,由于必须授权用户执行返回部分视图的操作,因此当用户的会话超时时,它将呈现登录页面而不是部分视图。我有多个地方正在使用类似的ajax调用,因此我添加了以下内容作为全局ajaxSuccess事件:

jQuery(document).ajaxSuccess(function (event, request, settings) {
    var isLogin = jQuery(request.responseText).find('.login-form').length;
    if (isLogin > 0) {
        var url = document.URL;
        var rootPath = '@Request.Url.GetLeftPart(UriPartial.Authority)';
        var path = url.replace(rootPath, '');
        var pathEncoded = encodeURIComponent(path);
        var loginURL = rootPath + "/Account/Login?returnUrl=" + pathEncoded;
        location.href = loginURL;
    }
});
这是可行的,因为当发出未经授权的ajax请求时,它会将用户重定向到登录页面。但是,它仍然在向div添加html,在重定向之前很短时间内,div是可见的


有没有办法让全局事件在本地事件之前触发?显示本地成功事件是在全局ajaxSuccess事件之前触发的,因此我尝试将ajax调用更改为使用complete,而不是success。这确实有效,但似乎出于某些原因,我需要在将来添加只在成功时执行的代码,我也会遇到同样的问题。有更好的方法来处理这个问题吗?

我可能建议您创建自己的API,包装
ajax
方法,以确保所需的功能(特别是操作顺序)。下面是一个过于简化的示例:

var async = function(props) {
  var finished = $.Deferred();
  $.ajax(props)
    .done(function(response) {
      // detect auth timeout, handle consisently
      if(response.isAuthTimeout) {
        // render login ui
        finished.reject('auth-timeout');
      } else {
        finished.resolve.apply(finished, arguments);
      }
    })
    .fail(function() {
      finished.reject.apply(finished, arguments);
    })
  return finished;
};
然后,在实践中,您将调用
async
(或者您决定调用包装器的任何东西),而不是本机的
$.ajax
API


有意义吗?

另外,这里还有一个好处,即通过这种方式,身份验证超时实际上会导致拒绝相关承诺。即使实际的HTTP请求成功了,您的意思是,等等——根据我们的API,这实际上是一个失败!是的,这是有道理的,而且这似乎是更好的处理方式。在这个应用程序中,这不是一个大问题,我认为(至少现在)我们只接受在重定向之前显示一段时间的视图,而不是改为使用本机ajax功能以外的其他功能。