2012-09-05 59 views
1

請考慮以下情形:我有一個可以打開對話框(jQuery對話框)的頁面。這個對話框允許用戶更新一些值,甚至插入新的值。用戶有時在「確認」按鈕上單擊幾次,觸發更新或插入與點擊次數相同的次數。該方法通過ajax調用(jquery ajax)觸發,在成功時向用戶顯示一個很好的「完成」消息。在ajax場景上實現post-redirect-pattern

在更新場景中,即使我的服務器代碼必須調用數據庫的更新命令的次數與調用該方法的次數一樣,也可以。然而,在插入的情況下,我的數據被多次提交,並在數據庫中插入了多行。這在其他方面造成了很多問題。

我閱讀了有關我的問題的理想解決方案後重定向獲取模式。但它只是說非ajax職位。什麼時候通過ajax調用來完成對方法的調用?如何防止用戶多次提交相同的內容?

我試圖阻止對話框上的按鈕,即使它工作,我認爲是不好的解決方案,因爲按鈕可能不會被阻止所有時間,特別是如果用戶在他的瀏覽器有問題。

回答

0

雖然內森泰勒的解決方案是可能和正確的,但我更喜歡做一些更簡單的事情。我創建了一個本地布爾值,用於檢查表單是否已提交。第一次提交表格時,這個變量收到true並阻止進一步的提交。檢查下面的代碼:

<script type="javascript"> 
var isSubmit = false; 

$('#myForm').submit(function(){ 
    //Check if this is the first time the form is submitted 
    if(isSubmit === true){ 
    return false; 
} 
isSubmit = true; 
//Executes the form submission as it should be 
}); 
</script> 

記住要創建對話框範圍本isSubmit變種,否則你不會能再提交這種形式,除非,當然,你改變的變量別的地方。

1

除了在用戶單擊後禁用保存按鈕(這是一個完全合理的解決方案)之外,另一種選擇是將唯一驗證令牌作爲表單提交的一部分,每次用戶單擊「保存」時都會對其進行驗證。

當請求表單視圖時,生成一個唯一標識符(GUID或類似),將其存儲在用戶的會話中,並將其傳遞給視圖。在視圖中,將唯一標識符作爲與表單一起提交的隱藏字段之一。現在,當處理表單提交時,請將請求中的值與會話中的值進行比較。如果請求和會話值匹配,則將會話中的值替換爲新的唯一標識符並執行數據庫操作。如果請求和會話值不匹配,您將知道該用戶是雙重提交的。

+0

它似乎是一個合理的解決方案。我會嘗試,如果它的工作,我會標記你的答案是正確的。謝謝 – AdrianoRR