我很茫然。现在,如果用户的会话超时,我的网站将重定向到登录页面。我想解决的一个问题是,当用户在登录时单击操作按钮时,他们会创建一个ajax请求。
我想在运行ajax调用之前捕获超时,弹出一个模式对话框,提示用户输入用户名和密码,然后在成功登录后进行ajax调用。
我的主要目标是在成功登录后运行ajax调用我不一定需要弹出窗口,但我认为这是最好的方法。
到目前为止我所做的就是这个。我创造了一个控制器,其目的是告诉我是否有超时。在ajaxStart()函数中,我加载一个div,调用该控制器的结果。如果该div中的html包含单词'Log On',那么我调用window.showModalDialog。这有时会起作用,有时却不起作用。对我来说,这感觉就像一个黑客,必须有一个更好的方法来完成它。任何想法??
function ajaxStart() {
var timeoutTest = $('#timeoutTest');
timeoutTest.load(timeoutUrl);
if (timeoutTest.html().indexOf('Log On') != -1) {
window.showModalDialog(logonUrl, "", "dialogHeight: 600; dialogWidth: 400");
}
tid = setTimeout(showSpinner, 500);
}
答案 0 :(得分:3)
我建议你看一下following article,其中Phil Haack说明了一种技术,可以让你配置你的应用程序,如果身份验证票已过期并且使用AJAX发出请求,则发送401状态码。然后,您可以非常轻松地在客户端上捕获此401状态代码并显示模式对话框。您甚至可以通过订阅.ajaxError()
事件处理程序并在一个地方处理这些错误来全局对页面上发生的所有AJAX请求执行此操作。
答案 1 :(得分:2)
使用ajax错误的问题是重定向到登录页面确实不是ajax错误,您可能需要将其用于其他事情。您的登录页面可能不应该总是返回401 IMHO,因为它实际上是一个公共页面。
我确保我的登录页面返回了我可以查找的自定义标题属性。我们使用了很多ajax,你可以在全局范围内查找它(这将阻止页面显示,并允许你做你喜欢的。
您的登录页面控制器方法如下所示:
public ActionResult LogOn()
{
Response.AddHeader("REQUIRES_AUTH", "1");
return View();
}
然后在全球范围内,您可以使用此jquery来处理它......
$(document).bind("ajaxComplete", function (event, request, settings) {
if (request.getResponseHeader("REQUIRES_AUTH") == "1") {
... addd popup code here.
};
});
PS你的原因并不总是有效的原因是你的超时测试必须在用户发布之前赶上到期日。这真的是一个乐透,让ajax完成通常是最好的。 (记住,登录页面仍然是对ajax帖子的有效响应,而不是我们想要的那个)
答案 2 :(得分:1)
为什么不向#timeoutTest
添加HTML类?然后就可以了
timeoutTest.hasClass('logon');