我正在處理用戶單擊註冊按鈕的表單,然後打開一個彈出窗口,以便用戶輸入註冊的詳細信息....用戶名應該這是唯一的,所以當用戶點擊提交按鈕即時檢查數據庫是否該用戶名已存在或沒有,如果它已經存在的IM顯示錯誤消息在'用戶名已存在'相同的彈出窗口.. 。在'保存'按鈕上打一個Ajax調用點擊彈出菜單
這是我爲它獲取的保存按鈕發射碼點擊
$.ajax({
url: '@Url.Content("~/Registration/CheckUNameExists")',
type: 'GET',
data: { UName: $('#UserName').val() },
success: function (data) {
if (data == 'True') {
$('#UserAddError').html('User Name already exists!');
} else {
$("#update-message").html('');
$("#addUserForm").submit();
$(this).dialog("close");
}
}
});
public JsonResult CheckUNameExists(string UName)
{
}
[HttpPost]
public ActionResult RegisterUser(Regitration Reg)
{
}
這是工作正常,但在極少數情況下THI這是一個問題。在用戶點擊保存按鈕幾次後,在彈出的詳細信息中填入詳細信息後,需要3-4秒的時間才能保存,在這種情況下,用戶點擊保存按鈕2-3次。在這種情況下,保存按鈕點擊是第一次檢查方法CheckUNameExists
,然後RegisterUser
被多次調用,基於用戶點擊保存按鈕的次數nd相同的記錄被多次保存到db中。
For測試的目的,我把一個斷點,讓我可以點擊'保存'按鈕n次,然後點擊保存按鈕4次,CheckUNameExists
只被第一次擊中,但之後RegisterUser
被稱爲4次,記錄被插入4倍。
不明白這裏的問題以及如何擺脫它?
我使用的緩存:假的,並點擊保存按鈕4倍,令人驚訝的「CheckUNameExists」被稱爲4倍,第二我一直在其他條件的警報味精ND該警報味精也解僱4次,但「CheckUNameExists」連續叫4倍nd警報味精也連續4次,而不是一個接一個....笏是其他選項你提到,我沒有得到他們? – sebastian
@sebastian Ajax調用是異步的,所以你可能仍然有競爭條件,因爲任何形式的提交的已註冊的用戶,並在數據庫中插入記錄之前的GET Ajax調用將完成。最安全的是不要信任發佈的數據,只有一個POST方法可以驗證用戶是否唯一併註冊他。爲了確保不存在競爭條件,您需要在交易中包裝用戶驗證和註冊。我編輯了我的答案。 –
Thnku,截至目前即時通訊禁用按鈕上的按鈕點擊並再次啓用它在成功功能....其工作正常..肯定會嘗試你提到的其他方式 – sebastian