Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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
C# 按F5键时防止页面刷新_C#_Asp.net_Page Refresh - Fatal编程技术网

C# 按F5键时防止页面刷新

C# 按F5键时防止页面刷新,c#,asp.net,page-refresh,C#,Asp.net,Page Refresh,我已经用服务器端控件创建了表单,比如button..,并且还编写了关于该控件的事件。。 现在,单击按钮后运行时,我已按F5刷新页面。页面加载执行正常,但按钮1\u click()事件也会触发…因此,在这种情况下,如何停止此事件执行。请建议我简短回答:不可能 再回答:没有网站可以阻止浏览器的功能,因为这将是浏览器的严重安全问题。欢迎使用web development,没有办法阻止页面刷新和重新发布,这完全是浏览器的行为 不过也有解决办法;您可以做的一件简单的事情是,在处理按钮单击后,您可以将浏览器

我已经用服务器端控件创建了表单,比如button..,并且还编写了关于该控件的事件。。
现在,单击按钮后运行时,我已按F5刷新页面。页面加载执行正常,但按钮1\u click()事件也会触发…因此,在这种情况下,如何停止此事件执行。请建议我

简短回答:不可能


再回答:没有网站可以阻止浏览器的功能,因为这将是浏览器的严重安全问题。

欢迎使用web development,没有办法阻止页面刷新和重新发布,这完全是浏览器的行为


不过也有解决办法;您可以做的一件简单的事情是,在处理按钮单击后,您可以将浏览器重定向回页面,以便刷新不会包括按钮按下的重新发布。显然,这可能需要其他状态管理系统(而不是视图状态),也许您可以在会话中存储状态。

您可以使用:

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

这将显示一条提示,询问用户是否希望导航,并且可能不希望导航。(另外,我不知道支持的范围)

您想要阻止的不是真正的页面刷新,而是页面重新发布

如前所述,在客户端是不可能的,因为刷新将重播浏览器在上一次操作中所做的操作

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

最简单的方法是在
页面加载
的隐藏字段中放置一种RequestID,并将其存储在
会话
中的某个位置。并在next
POST
上控制其值以使请求有效,然后覆盖它以避免使用相同的RequestID重新发布

也许有更好的办法:)


您的“问题”类似于用户双击的恐怖行为:

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

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

但自2004年以来,Webforms就解决了这一问题(甚至在此之前,我在2001年编写了一个简单的票证解决方案),这篇文章:

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


 <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>
函数checkKeyCode(evt)//用于F5禁用 { var evt=(evt)?evt:((事件)?事件:空); var节点=(evt.target)?evt.target:((evt.srcement)?evt.srcement:null); if(event.keyCode==116)//禁用F5 { evt.keyCode=0; 返回错误 } 如果(event.keyCode==123){ evt.keyCode=0; 返回错误 } 如果(event.keyCode==93){ evt.keyCode=0; 返回错误 } if(event.altKey==true&&event.keyCode==115)//禁用alt-F4 { evt.keyCode=0; 返回错误 } //警报(事件键码); } document.onkeydown=checkKeyCode;

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

F5刷新问题的唯一解决方案是
响应。重定向
。请看我关于这个主题的帖子


我得到了一些不允许您按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>

关键代码测试!
变量x,ctrlKeyPressed=false;
函数keyDown(e){
x=e.charCode | | e.keyCode;
document.getElementById(“key”).innerHTML=x;
如果(x==17){
ctrlKeyPressed=true;
}
如果(ctrlKeyPressed&&x==82){
e、 预防默认值();
}else如果(x==116){
e、 预防默认值();
}
}
功能键控(e){
x=e.charCode | | e.keyCode;
如果(x==17){
ctrlKeyPressed=false;
}
}
window.onload=函数(){
document.onkeydown=函数(e){
键控(e);
};
document.onkeyup=函数(e){
keyUp(e);
};
}
按一个键!

关键代码:没有
我不是网络程序员,但我会尝试头脑风暴。这不是一个关于回邮之类的故事吗?如果你能确认它是否是回发邮件等,它会工作吗?嗨…乔..现在当我保存一个记录时。。。我正在同一页面中显示成功消息。如果我刷新页面(ctrl+F5)或F5..将插入更多记录。因此,使用相同的细节插入两条记录。避免插入重复记录。解决该用例的方法是发布到不同的URL、处理,然后重定向回第一页,并在查询字符串中显示成功或错误消息。不幸的是,ASP.NET的回发模型使得这几乎不可能。您所能做的就是在成功处理后重定向到“谢谢”样式的页面(与第一页完全分开)。这样,如果用户刷新,它就不会重新提交。从本质上讲,你永远不能以发起动作的帖子的相同响应来显示结果。另外,对幂等性做一些研究。您需要使动作幂等:-)