什麼是防止用戶雙擊或刷新頁面的最好方法,這會導致執行SQL插入語句兩次,我試圖在點擊後禁用按鈕,但結果並不是很好。我期待可以從代碼隱藏的角度來做到這一點。更多的東西像SQL提交和回滾SQL插入語句執行兩次
1
A
回答
1
也許PRG wikipedia article可以幫助你:
郵政/重定向/獲取(PRG)是Web開發人員 常見的設計模式,以幫助避免某些重複的表單提交,並允許用戶代理 可以更直觀地使用書籤和刷新按鈕。
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
塊 - 隊列關閉所有連接隨後在下一次點擊客戶端時執行後續操作(如果操作已在進行中,此僞代碼僅返回)
- 我已經找到了最簡單的解決方案,但實際上更好的做法是將這個包含在一個異步運行的服務中,這樣您就可以監視進程,既爲用戶帶來好處,也爲了防止多個並行進程。
相關問題
- 1. Vb.net插入行語句執行兩次
- 2. SQL Server插入。 。 。執行語句
- 3. SQL插入執行兩次,php
- 4. SQL插入查詢執行兩次
- 5. JPA在插入操作之前執行兩次select語句
- 6. 循環觸發插入語句兩次
- 7. Python 3會執行兩次語句嗎?
- 8. return語句執行兩次無環
- 9. GDB執行相同的語句兩次
- 10. PHP插入語句在Firefox中運行兩次,一次在I.E
- 11. SQL插入語句
- 12. 執行SQL語句
- 13. 執行SQL語句
- 14. SQL執行語句
- 15. 正在執行兩次的SqlCommand SQL語句
- 16. sql插入語句語法
- 17. 無法執行插入語句
- 18. 對插入語句執行標量
- 19. 如何動態執行插入語句
- 20. 告訴NHibernate執行插入語句
- 21. PHP插入語句插入數組值兩次
- 22. 哪個語句會執行sql中的第一次插入或更新
- 23. mysqli的插入執行兩次
- 24. PHP錯誤 - IF語句所做插入運行兩次
- 25. SQL語句插入語句爲空?
- 26. 插入多行sql語句phonegap
- 27. 執行兩個INSERT語句
- 28. SQL Compact - 執行多個插入語句時出錯
- 29. 在插入後從執行select語句停止LINQ to SQL
- 30. 使用執行INSERT語句中的子插入語句的MyBatis
PRG不會阻止多個表單提交作爲雙擊或在長時間運行請求期間(例如在發出「重定向」響應之前)的頁面刷新的結果。 OP詢問了一種方法,可以防止雙擊時出現重複,不一定只是在完成一切後刷新頁面。 –
@AlexNorcliffe,謝謝澄清。我會保留讓人們可以閱讀你的評論的答案。 +1 – danihp