2012-09-25 30 views
1

我正在製作一個電子商務web應用程序(在MVC3中),現在我正在測試它。我的問題是:無論何時在提交按鈕上點擊很多次,我會盡可能多地請求並將其保存在db上。所以我正在實現一些客戶端和服務器端代碼來防止這些多次提交。該客戶端包含在阻止屏幕每當有人點擊提交按鈕這樣的:jQueryUI的blockUI不合適地阻止

$(document).ready(function() { 
    $('input[type=submit]').click(function() { 
     blockScreen(); 
    }); 

    $.unblockUI(); 
} 
function blockScreen() { 
    $.blockUI({ message: '<h1><img src="../images/processing.gif" /></h1>' 
}); 

我與blockUI遇到的問題是當有人點擊一個提交,但有一個ModelState中的錯誤(如非填充必填字段)屏幕被阻止,除非重新加載或使用瀏覽器的控制檯,否則無法解除屏蔽。

服務器端驗證,所以它不會有複製以後我會做,所以沒有必要考慮這個問題......

+0

爲什麼你不阻止你的屏幕r模型的代碼,即僅當發送請求時(當然,當存在結果時將其刪除)? – Bergi

+1

當驗證爲真時調用函數blockScreen()。 – krish

+0

@Bergi你是什麼意思屏蔽模型的代碼屏幕? – leobelones

回答

1

我找到了答案,它...以下krish的意見,我說這個劇本:

<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>我主視圖,並在我的js上使用這個:

$('form').submit(function() { 
    if ($(this).valid()) { 
     blockScreen(); 
    } 
}); 
0

也許你正在使用AJAX請求發送數據到數據庫, 對?

無需使用'點擊'事件。 有人可以通過在輸入字段內按Enter來提交表單,並且我不確定在這種情況下點擊事件是否被觸發。

我想你suould使用類似的東西:

var isBlocked = false; 

$('form').submit(function(){ 

    $.ajax({ 
    url: 'database.html', 
    beforeSend: function (data) { 
     var state = isBlocked; 
     isBlocked = true; 
     // Returning false in the beforeSend function will cancel the request. 
     return !state; 
    }, 
    complete: function(data) { 
     // complete executes on both success and fail 
     isBlocked = false; 
    } 
    }); 


}); 

`