2011-12-02 201 views
1

什麼是防止用戶雙擊或刷新頁面的最好方法,這會導致執行SQL插入語句兩次,我試圖在點擊後禁用按鈕,但結果並不是很好。我期待可以從代碼隱藏的角度來做到這一點。更多的東西像SQL提交和回滾SQL插入語句執行兩次

回答

1

也許PRG wikipedia article可以幫助你:

郵政/重定向/獲取(PRG)是Web開發人員 常見的設計模式,以幫助避免某些重複的表單提交,並允許用戶代理 可以更直觀地使用書籤和刷新按鈕。

+1

PRG不會阻止多個表單提交作爲雙擊或​​在長時間運行請求期間(例如在發出「重定向」響應之前)的頁面刷新的結果。 OP詢問了一種方法,可以防止雙擊時出現重複,不一定只是在完成一切後刷新頁面。 –

+0

@AlexNorcliffe,謝謝澄清。我會保留讓人們可以閱讀你的評論的答案。 +1 – danihp

1

如果您希望防止出現這種情況,您需要服務器知道當前用戶已經開始了一個操作,並且在條件滿足之前不能再次開始操作。

您需要能夠識別可能訪問您網站的用戶。這很簡單,只需使用SessionState即可完成,但如果您沒有其他SessionState需求並希望大規模擴展您的應用程序,則可以使用簡單的隨機Cookie來標識用戶,作爲用於將項目放入服務器緩存。

假設你使用了SessionState。你會像做以下(僞):

public void StartAction() 
{ 
    var inProgress = HttpContext.Current.Session["actionInProgress"] as bool; 
    if (!inProgress) 
    { 
    try 
    { 
     HttpContext.Current.Session["actionInProgress"] = true; 
     MySqlController.DoWork(); 
    } 
    finally 
    { 
     HttpContext.Current.Session["actionInProgress"] = false; 
    } 
    } 
} 

以上不考慮以下幾點:

  • 捕獲異常和/或在您的finally
  • 隊列關閉所有連接隨後在下一次點擊客戶端時執行後續操作(如果操作已在進行中,此僞代碼僅返回)
  • 我已經找到了最簡單的解決方案,但實際上更好的做法是將這個包含在一個異步運行的服務中,這樣您就可以監視進程,既爲用戶帶來好處,也爲了防止多個並行進程。