Asp.net有一個很討厭的特性,點擊一個Button後,如果還在原來的頁面的話,按F5刷新的時候會重新執行剛纔的那個按鈕事件,這個問題比較實用並簡單的解決方法就是執行完按鈕事件以後重新打開一次頁面
另外一個會出現重複提交的情況是:網速比較慢的時候,點擊Button可能要等個好幾秒纔會執行完,這時候有的用戶就容易習慣性地再點幾次按鍵,就造成了多次提交,特別是添加新信息的時候,程序中無法判斷哪條信息是正常的,哪條是誤點擊提交的,於是就會全部添加到數據庫裏面。這種錯誤信息在開發的時候很難檢查出來,因爲本地運行程序都比較快,傳到服務器上時纔會出現這樣的問題。有人說在客戶端JS代碼中把Button禁用掉,如下所示:
<script type="text/javascript"></script>
後臺的Page_Load中添加
btnSend.Attributes["onclick"] = "return checkForm();";
貌似非常完美的解決方法,但經過測試,這種方法根本行不通,這個時候客戶的請求並沒有提交,在客戶端JS代碼中把按鈕給禁用了,於是客戶的請求就永遠也提交不了了。
今天中午調試程序,又碰到這個問題,不經意間想起了如下解決方法,不妨一試,原理如下:
頁面中放一個隱藏的變量來標識是否已經進行過提交,點擊Button的時候根據此變量的值來判斷是否是第一次點擊,是的話,改變變量的值,並允許提交請求,否則的話提示用戶不能重複提交,並返回False。
代碼如下:
頁面中添加一個HiddenField,ID爲"submitted",然後添加如下JS代碼:
function checkForm()
{
if(document.getElementById("submitted").value == "submit")
{
alert("您的請求正在處理中,請不要重複提交");
return false;
}
document.getElementById("submitted").value = "submit";
return true;
}
後臺Page_Load中添加:
btnSend.Attributes["onclick"] = "return checkForm();";
簡單測試,OK
下面是在網上看到的兩個方法,標記一下,有空試試
解決方法一:
.Framework2.0中才有的button屬性:
解決重複提交:OnClientClick="this.disabled=true;this.form.submit();" UseSubmitBehavior="False"
解決方法二:
this.btnSubmit.Attributes["onclick"] = this.GetPostBackEventReference(this.btnSubmit) + ";this.disabled=true;"; //防止重複提交