防止按下F5键时页面刷新

5

我已经使用服务器端控件如按钮创建了表单..并且已经在其中编写了事件.. 现在,在点击该按钮后运行时,我通过按F5刷新页面。Page_Load正常执行,但Button1_Click()事件也会触发.. 那么在这种情况下如何停止此事件的执行呢?请给我建议。


我不是Web程序员,但我尝试着进行头脑风暴。这不是关于PostBack或类似的故事吗?如果您验证一下它是否为PostBack,那么它会起作用吗? - Will Marcouiller
9个回答

11

简短回答:不可能

更详细的回答:没有网站可以阻止浏览器的功能,因为这会对浏览器造成严重的安全问题。


嗨... Joel... 目前当我保存记录时,我会在同一页上显示成功消息。如果我刷新页面(ctrl + F5)或F5,则会插入另一条记录。因此,相同的详细信息会插入两个记录。我需要防止插入重复记录。 - karthik k
1
解决此用例的方法是发布到不同的URL进行处理,然后在查询字符串中将成功或错误消息重定向回第一个页面。不幸的是,ASP.NET的后台模型使这几乎不可能。你能做的就是在成功处理后重定向到一个“感谢”样式页面(与第一个页面完全分离)。这样,如果用户刷新它,它就不会重新提交。本质上,你必须永远不要在与启动操作相同的响应中显示结果。 - Joel Martinez
1
另外,对幂等性进行一些研究。你需要让你的操作具有幂等性 :-) http://en.wikipedia.org/wiki/Idempotent - Joel Martinez

5
欢迎来到Web开发,无法阻止页面刷新和重新提交,这完全是浏览器的行为。不过有解决方法:在处理按钮点击后,你可以将浏览器重定向回页面,这样刷新就不会包括重新提交按钮按下的内容。显然,这可能需要一些其他的状态管理系统(而不是视图状态),也许你可以将状态存储在会话中。

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按钮的位置。


2
海报正在使用ASP.NET WebForms。在MVC中,使用Post-Redirect-Get模式,这不是一个问题。
但是自2004年以来,Webforms的这个问题已经得到解决(甚至在此之前 - 我在2001年编写了一个简单的票务解决方案),使用这篇文章:http://msdn.microsoft.com/en-us/library/ms379557.aspx 基本上,作者为每个请求创建一个唯一的票证,并在第一次回发后取消票证的有效性。任何意外(或恶意)的后续回发都将被忽略。它被包装在一个基础页面中,因此应该很容易添加到任何Webforms解决方案中。

2

你可以使用以下方法:

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

这会显示一个提示,询问用户是否要离开当前页面,可能不是想要的。(而且,我不知道支持程度)


1

你想要阻止的不是页面刷新,而是页面重新POST

正如已经说过的那样,客户端无法实现,因为刷新会重放浏览器上次操作的内容。

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

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

也许还有更好的方法 :)

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


1

在点击按钮时,您是否需要刷新页面?您能否重新连接按钮,使其发出ajax调用以提交数据?如果可以的话,那么您就不必担心页面在刷新时重新提交。


0

0

我有一些代码,它不允许您按下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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接