1

私は(MVC3で)eコマースWebアプリケーションを作成していますが、現在テスト中です。私の問題は次のとおりです。誰かが送信ボタンを何度もクリックするたびに、同じ数のリクエストを作成し、何度もデータベースに保存します。したがって、これらの複数の送信を防ぐために、クライアント側とサーバー側のコードをいくつか実装しています。クライアント側は、誰かが次のような送信ボタンをクリックするたびに画面をブロックすることで構成されています。

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

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

私が blockUI で抱えている問題は、誰かが送信をクリックしたときに ModelState エラー (入力されていない必須フィールドなど) がある場合、画面がブロックされ、リロードするかブラウザーのコンソールを使用しない限りブロックを解除できないことです。

サーバー側の検証なのでレプリケーションはありません。後で行うので、この質問で考慮する必要はありません...

4

2 に答える 2

1

私はそれに対する答えを見つけました...クリッシュのアドバイスに従って、このスクリプトを追加しました:

<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>私のマスタービューに追加し、これを私のjsで使用しました:

$('form').submit(function () {
    if ($(this).valid()) {
        blockScreen();
    }
});
于 2012-09-25T20:07:31.740 に答える
0

おそらく、AJAX リクエストを使用してデータベースにデータを送信しているのではないでしょうか?

「クリック」イベントを使用する必要はありません。入力フィールド内で Enter キーを押すだけでフォームを送信できますが、この場合、クリックイベントが発生するかどうかはわかりません。

私はあなたがそのようなものを使うべきだと思います:

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;
    }
  });


});

`

于 2012-09-25T18:02:12.440 に答える