我已经创建了带有服务器端控件的表单,例如按钮..并且还写了事件..现在单击按钮后运行时我通过按 F5 刷新页面。Page_load 执行正常,但 button1_click() 事件也触发.. .那么我怎样才能在这种情况下停止这个事件的执行。请建议我
9 回答
简短的回答:不可能
更长的答案:没有网站可以阻止浏览器的功能,因为这对浏览器来说是一个严重的安全问题。
欢迎来到web开发,没有办法阻止页面刷新和转发,这完全是浏览器的行为。
不过有一些解决方法;您可以做的一件简单的事情是在处理完您的按钮点击后,您可以将浏览器重定向回页面,这样刷新就不会包括重新发布您的按钮按下。显然这可能需要一些其他的状态管理系统(而不是视图状态),也许你可以将你的状态存储在 Session 中。
<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 按钮的位置。
您可能会使用:
window.onbeforeunload = function ()
{
return false;
}
这将显示一个提示,询问用户是否想要离开并且可能不需要。(另外,我不知道支持的程度)
海报使用 ASP.NET WebForms。在 MVC 中,使用 Post-Redirect-Get 模式,这不是问题。
但自 2004 年以来(甚至在此之前 - 我在 2001 年编写了一个简单的票证解决方案),Webforms 已经解决了这个问题:http: //msdn.microsoft.com/en-us/library/ms379557.aspx
基本上,作者创建与每个请求相关联的唯一票证,并在第一次回发时删除票证的有效性。任何意外(或恶意)的后续回发都将被忽略。它包含在一个基本页面中,因此应该很容易添加到任何 Webforms 解决方案中。
您要阻止的并不是真正的页面刷新,而是它的页面重新- POST
。
如前所述,这在客户端是不可能的,因为刷新将重播浏览器在最后一个操作中所做的事情。
但是您可以在服务器端捕获它,因为服务器可以保存一些信息来控制请求。
最简单的方法是将某种RequestID放在一个隐藏字段中Page Load
,将其存储在Session
. 并控制其值 on nextPOST
以验证请求,然后覆盖它以避免重新POST
使用相同的RequestID。
也许有更好的方法:)
您的“问题”类似于用户双击恐怖行为:ASP.Net 双击问题
您是否必须在单击按钮时刷新页面?您能否重新连接按钮以进行 ajax 调用以提交数据?如果是这样,那么您无需担心刷新时重新提交页面。
我有一些代码不允许您按 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>
F5 刷新问题的唯一解决方案是Response.Redirect
. 请参阅我关于此主题的帖子。