Javascript 如何静默地保证在页面卸载时执行ASP.NET MVC3操作
当用户离开页面时,我需要执行控制器的操作(关闭、刷新、转到链接等)。操作代码如下所示:Javascript 如何静默地保证在页面卸载时执行ASP.NET MVC3操作,javascript,jquery,ajax,asp.net-mvc,asp.net-mvc-3,Javascript,Jquery,Ajax,Asp.net Mvc,Asp.net Mvc 3,当用户离开页面时,我需要执行控制器的操作(关闭、刷新、转到链接等)。操作代码如下所示: public ActionResult窗口卸载(int令牌) { MyObject[token].Dispose(); 退货内容(“已处置”); } 在窗口下载时,我对操作执行Ajax请求: $(窗口)。卸载(函数() { $.ajax({ 类型:“POST”, url:“@url.Action(“WindowUnload”)”, 数据:{token:@ViewData[“token”]}, cache:f
public ActionResult窗口卸载(int令牌)
{
MyObject[token].Dispose();
退货内容(“已处置”);
}
在窗口下载时,我对操作执行Ajax
请求:
$(窗口)。卸载(函数()
{
$.ajax({
类型:“POST”,
url:“@url.Action(“WindowUnload”)”,
数据:{token:@ViewData[“token”]},
cache:false,
异步:true
});
//警惕(“处置”);
})
上面的ajax
请求没有到达我的控制器,即操作没有执行。
要使上述代码正常工作,我必须取消注释警报
行,但我不想对用户发出警报
如果我将async
选项更改为false
(alert
被注释),那么它有时会起作用。例如,如果我刷新页面的次数过快,则不会在每次卸载时执行该操作
对于如何在每次卸载时执行操作而不发出警报,有何建议?
注意,我不需要从操作返回任何内容到页面
更新:答案摘要
不可能可靠地在卸载时执行请求,因为它在卸载时不是正确的或预期的行为。因此,最好重新设计应用程序,避免在窗口卸载时执行HTTP请求。
如果无法避免,则有常见的解决方案(如问题所述):
ajax
,即async:false
。
- 优点:在大多数情况下都有效
- 优点:沉默
- 缺点:在某些情况下不起作用,例如,当用户刷新窗口几次太快时(在Firefox中观察到)
success
或ajax
调用后使用alert
- 优点:似乎在所有情况下都有效
- 缺点:不是静默和火灾弹出警报
根据文档,使用
async:false
时,它应该可以正常工作。然而,这总是有点不稳定-例如,用户可以通过关闭/崩溃浏览器离开您的页面,您将不会收到任何回调。此外,浏览器实现也各不相同。我担心您甚至无法获得任何故障保护。根据文档,使用async:false
它应该可以正常工作。然而,这总是有点不稳定-例如,用户可以通过关闭/崩溃浏览器离开您的页面,您将不会收到任何回调。此外,浏览器实现也各不相同。我担心您甚至无法获得任何防故障功能。这是行不通的,即使您能够以某种方式使其工作,以后也会给您带来很多麻烦,因为这不是浏览器/HTTP的使用方式。当页面卸载(在浏览器中)时,浏览器将调用卸载事件,然后卸载页面(您不能让它等待,甚至我也不能进行同步ajax调用),如果调用正在进行,并且浏览器在执行代码后卸载页面,呼叫也会被取消,这就是为什么有时会在服务器上看到呼叫,有时呼叫不起作用。如果你能告诉use你为什么要这样做,我们可以建议你一个更好的方法。这是行不通的,即使你能以某种方式让它工作起来,以后也会给你带来很多麻烦,因为这不是浏览器/HTTP应该使用的方式。当页面卸载(在浏览器中)时,浏览器将调用卸载事件,然后卸载页面(您不能让它等待,甚至我也不能进行同步ajax调用),如果调用正在进行,并且浏览器在执行代码后卸载页面,呼叫也会被取消,这就是为什么有时会在服务器上看到呼叫,有时呼叫不起作用。如果你能告诉use你为什么要这样做,我们可以建议你一个更好的方法。你不能。你唯一能做的就是提示用户留下来,并希望一切都好起来。这里有很多安全问题 你不能。你唯一能做的就是提示用户留下来,并希望一切都好起来。这里有很多安全问题 HTTP是无状态的,您永远无法找到可靠的方法来检测用户是否离开了您的页面
建议的活动:
- 会话超时(如果正在使用会话)
- 应用程序正在下降
- 计时器(需要与前面的建议结合使用)
- 访问新页面时删除上一个令牌
- 会话超时(如果正在使用会话)
- 应用程序正在下降
- 计时器(需要与前面的建议结合使用)
- 访问新页面时删除上一个令牌
- HTTP是无状态的,您永远无法找到可靠的方法来检测用户是否离开了您的页面
建议的活动:
$(window).bind('beforeunload', function()
{
alert('unloading!');
}
);
或
您是否尝试过在卸载()之前启用
$(window).bind('beforeunload', function()
{
alert('unloading!');
}
);
或
为什么要这样做 从您发布的代码片段中,您正试图使用它来处理服务器端的对象?您应该调用Dispose来处理正在使用的对象(例如数据库连接) 这应该在处理每个请求的过程中完成。当客户端关闭浏览器窗口时,不应该有任何未管理的资源等待处置
如果您正以上述方式尝试此操作,则需要重新编写代码。为什么需要这样做 从您发布的代码片段中,您正试图使用它来处理服务器端的对象?您应该调用Dispose来处理正在使用的对象(例如数据库连接) 这应在eac处理过程中完成