C# 按F5键时防止页面刷新
我已经用服务器端控件创建了表单,比如button..,并且还编写了关于该控件的事件。。C# 按F5键时防止页面刷新,c#,asp.net,page-refresh,C#,Asp.net,Page Refresh,我已经用服务器端控件创建了表单,比如button..,并且还编写了关于该控件的事件。。 现在,单击按钮后运行时,我已按F5刷新页面。页面加载执行正常,但按钮1\u click()事件也会触发…因此,在这种情况下,如何停止此事件执行。请建议我简短回答:不可能 再回答:没有网站可以阻止浏览器的功能,因为这将是浏览器的严重安全问题。欢迎使用web development,没有办法阻止页面刷新和重新发布,这完全是浏览器的行为 不过也有解决办法;您可以做的一件简单的事情是,在处理按钮单击后,您可以将浏览器
现在,单击按钮后运行时,我已按F5刷新页面。页面加载执行正常,但按钮1\u click()事件也会触发…因此,在这种情况下,如何停止此事件执行。请建议我简短回答:不可能
再回答:没有网站可以阻止浏览器的功能,因为这将是浏览器的严重安全问题。欢迎使用web development,没有办法阻止页面刷新和重新发布,这完全是浏览器的行为
不过也有解决办法;您可以做的一件简单的事情是,在处理按钮单击后,您可以将浏览器重定向回页面,以便刷新不会包括按钮按下的重新发布。显然,这可能需要其他状态管理系统(而不是视图状态),也许您可以在会话中存储状态。您可以使用:
window.onbeforeunload = function ()
{
return false;
}
这将显示一条提示,询问用户是否希望导航,并且可能不希望导航。(另外,我不知道支持的范围)您想要阻止的不是真正的页面刷新,而是页面重新发布 如前所述,在客户端是不可能的,因为刷新将重播浏览器在上一次操作中所做的操作 但是您可以在服务器端捕获它,因为服务器可以保存一些信息来控制请求 最简单的方法是在
页面加载
的隐藏字段中放置一种RequestID,并将其存储在会话
中的某个位置。并在nextPOST
上控制其值以使请求有效,然后覆盖它以避免使用相同的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的回发模型使得这几乎不可能。您所能做的就是在成功处理后重定向到“谢谢”样式的页面(与第一页完全分开)。这样,如果用户刷新,它就不会重新提交。从本质上讲,你永远不能以发起动作的帖子的相同响应来显示结果。另外,对幂等性做一些研究。您需要使动作幂等:-)