Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何静默地保证在页面卸载时执行ASP.NET MVC3操作_Javascript_Jquery_Ajax_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

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处理过程中完成