【问题标题】:Global ajaxSuccess event before local success event本地成功事件之前的全局 ajaxSuccess 事件
【发布时间】:2014-02-24 19:27:06
【问题描述】:

我有一个 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 请求时将用户重定向到登录页面。但是,它仍然在将 html 添加到 div 中,在重定向前一小段时间可见。

有没有办法让全局事件在本地事件之前触发? jQuery API 表明本地成功事件是在全局 ajaxSuccess 事件之前触发的,所以我尝试将 ajax 调用更改为使用完成,而不是成功。这确实有效,但似乎如果由于某些原因我需要在将来添加仅在成功时执行的代码,我会遇到同样的问题。有没有更好的方法来处理这个问题?

【问题讨论】:

    标签: javascript jquery asp.net ajax asp.net-mvc


    【解决方案1】:

    我可能会建议您创建自己的 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。

    有意义吗?

    【讨论】:

    • 另外,这里还有一个额外的好处是,这种方式 auth-timeout 实际上会导致相关承诺的拒绝。尽管实际的 HTTP 请求成功了,但你说,等等——根据我们的 API,这实际上是一个失败!
    • 是的,这是有道理的,而且这似乎是一种更好的处理方式。在这个应用程序中,这不是一个大问题,我认为(至少现在)我们会接受在重定向之前显示一段时间的视图,而不是更改为使用原生 ajax 函数以外的东西。
    猜你喜欢
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2020-12-23
    • 2011-09-01
    • 2016-04-14
    相关资源
    最近更新 更多