我需要在用户离开页面(关闭、刷新、转到链接等)时执行 Controller 的操作。操作代码如下:
public ActionResult WindowUnload(int token)
{
MyObjects[token].Dispose();
return Content("Disposed");
}
在窗口下载时,我对操作执行 Ajax
请求:
$(window).unload(function ()
{
$.ajax({
type: "POST",
url: "@Url.Action("WindowUnload")",
data: {token: "@ViewData["Token"]"},
cache: false,
async: true
});
//alert("Disposing.");
})
上面的 ajax
请求没有到达我的 Controller ,即没有执行操作。
要使上面的代码正常工作,我必须取消注释 alert
行,但我不想对用户发出警报。
如果我将 async
选项更改为 false
(alert
被注释),那么它有时会起作用。例如,如果我刷新页面的次数过快,那么每次卸载时都不会执行该操作。
关于如何在没有警报的情况下对每次卸载执行操作有什么建议吗? 请注意,我不需要将操作中的任何内容返回到页面。
更新:答案总结
不可能可靠地执行卸载请求,因为它不是正确的或预期的卸载行为。所以最好重新设计应用程序并避免在窗口卸载时进行 HTTP 请求。 如果无法避免,则有常见的解决方案(在问题中描述):
- 同步调用
ajax
,即async: false
。- 优点:在大多数情况下都有效。
- 优点:沉默
- 缺点:在某些情况下不起作用,例如,当用户多次快速刷新窗口时(在 Firefox 中观察到)
- 在
success
或ajax
调用后使用alert
- 优点:似乎适用于所有情况。
- 缺点:不是无声的,火会弹出警报。
最佳答案
根据 unload
文档,使用 async: false
它应该按预期工作。然而,这总是有点不稳定——例如,用户可以通过关闭/崩溃浏览器来离开你的页面,而你将不会收到任何回调。此外,浏览器实现各不相同。我担心你甚至不会得到任何故障证明。
关于javascript - 如何默默地保证在页面卸载时执行 ASP.NET MVC3 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7875738/