2010-11-19 297 views
4

我已經創建與服務器端控件像按鈕的形式..並且也有寫的事件.. 現在運行時後,點擊按鈕我刷新了按F5.Page_load頁正在執行罰款的button1_Click()事件也燒成...所以,我怎麼能停在這scenario.Please此事件執行建議我防止按F5上的頁面刷新

+0

我沒有Web程序員,但我給它一個嘗試,以集思廣益。這不是一個關於回傳或類似的故事嗎?它會工作,如果你確認它是否是一個回發等? – 2010-11-19 15:59:16

回答

11

答案很簡單:不可能

再回應:沒有網站可以阻止瀏覽器的功能因爲這對瀏覽器來說是一個嚴重的安全問題。

+0

嗨......喬爾......當我保存一條記錄時,很安全......我在同一頁面顯示一條成功消息。如果irefresh頁(ctrl + F5)或F5..one更多的記錄正在插入。所以,插入相同的細節tworecords。我需要防止插入重複記錄。 – 2010-11-19 16:00:23

+1

圍繞該用例的解決方法是發佈到不同的URL,進程,然後重定向回第一頁,在查詢字符串中顯示成功或錯誤消息。不幸的是,ASP.NET的post-back模型使得這幾乎不可能。您成功處理到「謝謝」樣式頁面(與第一頁完全分離)後,您所能做的就是重定向。這樣,如果用戶刷新它,它將不會重新提交。實質上,您不得以與發起該行動的帖子相同的迴應顯示結果。 – 2010-11-19 17:03:19

+1

另外,對冪等性做一些研究。你需要使你的行爲冪等:-) http://en.wikipedia.org/wiki/Idempotent – 2010-11-19 17:04:33

6

歡迎來到網站開發,沒有辦法阻止網頁刷新和重新發布,這完全是瀏覽器行爲。

雖然有工作,一件簡單的事情,你可以做的是處理你的按鈕點擊後,你可以將瀏覽器重定向到頁面,以便刷新不會包括您的按鈕重新發布。顯然這可能需要一些其他的狀態管理系統(而不是視圖狀態),也許你可以將你的狀態存儲在會話中。

2

您可能使用:

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

這將顯示一個提示,詢問用戶是否要瀏覽路程,可能不期望。 (另外,我不知道支持的程度)

1

它不是真正的頁面刷新,你想阻止,其頁面重新編號爲POST

如前所述,在客戶端無法實現,因爲刷新會重播瀏覽器在最後一個操作中所做的操作。

但是你可以把它放在服務器端,因爲服務器可以容納一些信息來控制請求。

最簡單的方法是把一個排序在一個隱藏字段的requestIdPage Load,一些地方保存它像Session。並控制它的值在下一個POST有效的請求,然後覆蓋它,以避免重新POST請求ID

也許有一個更好的辦法:)

你的「問題」類似於用戶雙擊恐怖行爲:ASP.Net double-click problem

1

你有刷新按鈕的點擊的頁面?你可以重新連接按鈕來進行Ajax調用來提交數據嗎?如果是這樣,那麼你就不必擔心刷新頁面重新提交。

2

海報正在使用ASP.NET WebForms。在MVC中,使用Post-Redirect-Get模式,這不會是一個問題。

不過,這已經自2004年解決了Web表單(甚至在這之前 - 我在2001年寫了一個簡單的車票溶液)的這篇文章:http://msdn.microsoft.com/en-us/library/ms379557.aspx

基本上筆者創建與每個請求相關聯的唯一的門票,和在第一次回發時刪除故障單的有效性。任何意外(或惡意)後續回發都會被忽略。它被封裝在一個基本頁面中,因此應該很容易添加到任何Webforms解決方案中。

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

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>