4

私の ASP.NET MVC4 アプリケーションには、モデルで定義され、コントローラー メソッドで実装されたリモート検証ルールがあります。私のフォームはページに動的に追加されます。そこで、次のコードを使用して検証をトリガーしました。

$(tabId).on("submit", formId, function (event) {
       event.preventDefault();

       var form = $(this);

       form.removeData("validator"); 
       $.validator.unobtrusive.parse(form);

       if (form.valid())
       {
           // form submission 

           // THIS part executes even though the remote validation returns false
       }

       return false;
 });

リモート検証を開始し、完了を待たずにフォームを送信します。他のフィールドが有効でない場合 (たとえば、名前が必須フィールドである場合)、送信が停止されます。ただし、リモート検証は待機しません。

SOでlink1link2などの回避策を見つけました。ただし、これらは自分のページで jQuery 検証ルールが定義されている場合にのみ機能します。ただし、MVC4 モデルの検証規則を使用しています。したがって、ビュー ページのルールを再度再定義することには興味がありません。

解決するアイデアはありますか?

4

4 に答える 4

5

バリデーターで pendingRequest 変数を使用して、フォームが送信しようとしたときにまだ保留中のものがあるかどうかを確認できます。

$(tabId).on("submit", formId, function (event) {
       event.preventDefault();
       var form = $('#formid');
       form.removeData("validator"); 
       $.validator.unobtrusive.parse(form);

       if (form.valid() && form.data('validator').pendingRequest == 0)
       {
           // form submission 
       } 
       return false;         
});  

また、フィールドの検証中にユーザーにメッセージを表示する場合は、startrequest 関数と stopRequest 関数を使用できます。

$(function(){
    var validator = $('#formid').data('validator');

    var oldStartRequest = validator.startRequest;
    validator.startRequest = function (element) {     
        console.log(element.name + ' has begun validating')
        oldStartRequest.apply(this, arguments);
    };

    var oldStopRequest = validator.stopRequest;
    validator.stopRequest = function (element, valid) {
        console.log(element.name + ' has finished validating');
        console.log(element.name + ' is valid: ' + valid)
        oldStopRequest.apply(this, arguments);
    };
});
于 2013-12-10T15:38:15.797 に答える
0

ここでの私の投稿は解決策を提供しますが、もっと良い方法があるはずです:

ASP.NET-MVC jQuery の目立たないリモート検証で誤検知が返される

于 2014-04-15T01:17:32.887 に答える
0

グローバルな ajax イベントにアタッチして、フォームを送信するときに応答を待っているものが何もないことを確認できます。テストされていない例

var isInAjaxCall = false;
var queuedFuncs = [];
$(function() {
    $(document).bind("ajaxStart", function () {
        isInAjaxCall = true;
     }).bind("ajaxStop", function () {
        isInAjaxCall = false;
        while(queuedFuncs.length > 0){
           queuedFuncs.shift();
        }
    });
});

function SubmitForm() {
    if (isInAjaxCall) {
        queuedFuncs.push('SubmitForm');
        return false;
    }

    var form = $('#form');
    form.removeData("validator");
    $.validator.unobtrusive.parse(form);

    if (form.valid()) {
        // form submission 
    }
    return false;
}
于 2013-11-22T18:03:53.970 に答える