javascript - 全局 ajaxSuccess 事件在本地成功事件之前

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

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

jQuery("#AddNew").click(function () {
    $.ajax({
        url: this.href,
        cache: false,
        success: function (html) {
            jQuery("#DivId").append(html);
        }
    });
    return false;
});

问题在于,由于必须授权用户执行返回部分 View 的操作,因此当用户的 session 超时时,它将呈现登录页面而不是部分 View 。我有多个地方使用类似的 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调用更改为使用完整,而不是成功。这确实有效,但似乎如果出于某种原因我需要在将来添加仅在成功时执行的代码,我会遇到同样的问题。有没有更好的方法来处理这个问题?

最佳答案

我可能建议创建您自己的 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(或您决定调用包装器的任何内容),而不是 native $.ajax API。

有道理吗?

关于javascript - 全局 ajaxSuccess 事件在本地成功事件之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21997075/

相关文章:

javascript - 加载数据、插入数据并滑动切换

javascript - jquery ui 对话框中使用的 asp.net 控件值在后面的代码中为空

c# - 登录操作后如何控制页面的可缓存性

asp.net - 无法在 Azure 上加载文件或程序集 Microsoft.Owin

javascript - 在我的代码中使用 Promises?使用延迟对象和 Jquery

javascript - 为什么手机上返回 "Unidentified"?

javascript - Fullcalendar ...我如何表示没有特定结束日期的任务

c# - asp.net Razor Pages - 根据另一个选择列表的选择更新选择列表

javascript - 下载大型 CSV 文件 - href 无意中 chop 结果

javascript - 在 Rails 3 中处理 js.erb 文件