【问题标题】:Prevent page refresh on pressing F5按 F5 防止页面刷新
【发布时间】:2010-11-19 15:55:14
【问题描述】:

我已经创建了带有服务器端控件(如按钮)的表单..并且还写了事件.. 现在单击按钮后的运行时我通过按 F5 刷新了页面。Page_load 执行正常,但 button1_click() 事件也触发了......那么在这种情况下我该如何停止这个事件的执行。请建议我

【问题讨论】:

  • 我不是 Web 程序员,但我会尝试头脑风暴。会不会是关于 PostBack 之类的故事?如果您验证它是否是PostBack等,它会起作用吗?

标签: c# asp.net page-refresh


【解决方案1】:

简答:不可能

更长的答案:没有网站可以阻止浏览器的功能,因为这对浏览器来说是一个严重的安全问题。

【讨论】:

  • hi...Joel..cureently 当我保存记录时...我在同一页面中显示成功消息。如果 irefresh 页面 (ctrl + F5) 或 F5.. 还有一条记录被插入。因此,以相同的细节插入了两条记录。我需要防止插入重复记录。
  • 解决该用例的方法是发布到不同的 URL、处理,然后重定向回第一页,并在查询字符串中显示成功或错误消息。不幸的是,ASP.NET 的回发模型使得这几乎是不可能的。您所能做的就是在成功处理后重定向到“谢谢”样式页面(与第一页完全分开)。这样,如果用户刷新它,它就不会重新提交。从本质上讲,您绝不能在与发起操作的帖子相同的响应中显示结果。
  • 另外,对幂等性进行一些研究。您需要使您的操作具有幂等性:-) en.wikipedia.org/wiki/Idempotent
【解决方案2】:

欢迎来到web开发,没有办法阻止页面刷新和转发,这完全是浏览器的行为。

虽然有变通办法;您可以做的一件简单的事情是,在处理完您的按钮点击后,您可以将浏览器 返回 重定向到页面,这样刷新就不会包括重新发布您的按钮按下。显然这可能需要一些其他的状态管理系统(而不是视图状态),也许您可​​以将您的状态存储在 Session 中。

【讨论】:

    【解决方案3】:
     <script type="text/javascript" language="javascript">
        function checkKeyCode(evt)// for F5 disable
        {
    
            var evt = (evt) ? evt : ((event) ? event : null);
            var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
            if (event.keyCode == 116)//disable F5
            {
                evt.keyCode = 0;
                return false
            }
            if (event.keyCode == 123) {
                evt.keyCode = 0;
                return false
            }
            if (event.keyCode == 93) {
                evt.keyCode = 0;
                return false
            }
            if (event.altKey == true && event.keyCode == 115) //disable alt-F4
            {
                evt.keyCode = 0;
                return false
            }
    
    
    
            //alert(event.keyCode);
        }
    
        document.onkeydown = checkKeyCode;
    
    </script>
    

    将此脚本发布到您的母版页或您想要阻止 F5 按钮的位置。

    【讨论】:

      【解决方案4】:

      您可能会使用:

      window.onbeforeunload = function ()
      {
          return false;
      }
      

      这将显示一个提示,询问用户是否想要离开并且可能不需要。 (另外,我不知道支持的程度)

      【讨论】:

        【解决方案5】:

        海报使用 ASP.NET WebForms。在 MVC 中,使用 Post-Redirect-Get 模式,这不是问题。

        但是自 2004 年以来,Webforms 已经解决了这个问题(甚至在那之前 - 我在 2001 年写了一个简单的票务解决方案),这篇文章:http://msdn.microsoft.com/en-us/library/ms379557.aspx

        基本上,作者为每个请求创建一个唯一的票证,并在第一次回发时删除票证的有效性。任何意外(或恶意)的后续回发都将被忽略。它包含在一个基本页面中,因此应该很容易添加到任何 Webforms 解决方案中。

        【讨论】:

          【解决方案6】:

          您要阻止的并不是真正的页面刷新,而是它的页面重新POST

          正如已经说过的,这在客户端是不可能的,因为刷新会重播浏览器在最后一个操作中所做的事情。

          但是你可以在服务器端捕获它,因为服务器可以保存一些信息来控制请求。

          最简单的方法是将一种 RequestID 放在Page Load 的隐藏字段中,并将其存储在Session 中的某个位置。并在下一个POST 上控制其值以验证请求,然后覆盖它以避免使用相同的RequestID 重新POST

          也许有更好的方法:)

          您的“问题”类似于用户双击恐怖行为:ASP.Net double-click problem

          【讨论】:

            【解决方案7】:

            您是否必须在单击按钮时刷新页面?您能否重新连接按钮以进行 ajax 调用以提交数据?如果是这样,那么您无需担心刷新时页面会重新提交。

            【讨论】:

              【解决方案8】:

              F5 刷新问题的唯一解决方案是Response.Redirect。请参阅我关于此主题的帖子。

              https://stackoverflow.com/questions/12596152/asp-net-f5-browser-refresh-duplicate-record/12596153#12596153

              【讨论】:

                【解决方案9】:

                我有一些代码不允许您按 F5 和/或 Ctrl + R:

                <!DOCTYPE html>
                <html>
                <head>
                <title>
                Key code test!
                </title>
                <script type="text/javascript">
                var x, ctrlKeyPressed = false;  
                function keyDown(e){            
                x = e.charCode || e.keyCode;
                document.getElementById("key").innerHTML = x;
                if(x == 17) {
                ctrlKeyPressed = true;
                }
                if(ctrlKeyPressed && x == 82) {
                e.preventDefault();
                } else if(x == 116) {
                e.preventDefault();
                }
                }
                function keyUp(e) {
                x = e.charCode || e.keyCode;
                if(x == 17) {
                ctrlKeyPressed = false;
                }
                }
                window.onload = function () {
                document.onkeydown = function (e) {
                keyDown(e);
                };
                document.onkeyup = function (e) {
                keyUp(e);
                };
                }
                </script>
                </head>
                <body>
                Press a key!
                <br/>
                Key code: <div style="display:inline;" id="key">Nothing</div>
                </body>
                </html>
                

                【讨论】:

                  猜你喜欢
                  • 2020-12-25
                  • 2011-09-13
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-05-13
                  • 1970-01-01
                  • 2013-11-06
                  相关资源
                  最近更新 更多