我有一个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添加到div中,在重定向之前可以看到很短的时间。
有没有办法让全局事件在本地事件之前触发? jQuery API表示在全局ajaxSuccess事件之前触发了本地成功事件,因此我尝试将ajax调用更改为使用complete,而不是成功。这确实有效,但似乎由于某些原因我需要在将来添加仅在成功时执行的代码,我将遇到同样的问题。有没有更好的方法来解决这个问题?
答案 0 :(得分: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。
有意义吗?