javascript - 如何默默地保证在页面卸载时执行 ASP.NET MVC3 操作

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

我需要在用户离开页面(关闭、刷新、转到链接等)时执行 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 请求。 如果无法避免,则有常见的解决方案(在问题中描述):

  1. 同步调用 ajax,即 async: false
    • 优点:在大多数情况下都有效。
    • 优点:沉默
    • 缺点:在某些情况下不起作用,例如,当用户多次快速刷新窗口时(在 Firefox 中观察到)
  2. successajax 调用后使用 alert
    • 优点:似乎适用于所有情况。
    • 缺点:不是无声的,火会弹出警报。

最佳答案

根据 unload文档,使用 async: false 它应该按预期工作。然而,这总是有点不稳定——例如,用户可以通过关闭/崩溃浏览器来离开你的页面,而你将不会收到任何回调。此外,浏览器实现各不相同。我担心你甚至不会得到任何故障证明。

关于javascript - 如何默默地保证在页面卸载时执行 ASP.NET MVC3 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7875738/

相关文章:

PHP 验证不起作用,被表单操作覆盖

javascript - 添加具有不同样式和js的wordpress web模板

javascript - jQuery scrolling 随机滚动

带有 #id 的 jQuery load() 不适用于 TEXTAREA

javascript - 如何通过正则表达式模式匹配对字符串数组中的元素进行排序

javascript - 复制带有 setter/getter 结果的对象

javascript - Uncaught TypeError : $(. ..).tooltip 不是 Laravel 应用程序中的函数(Bootstrap 4 预设)

javascript - 使用 php 在 AJAX 中进行长轮询

javascript - 如何使用 JQuery 通过 Ajax 加载页面片段

javascript - 在 Google map 上添加点击标记以计算到标记的距离