2011-11-09 20 views
4

私はMVC3クライアント側の検証を使用しています。バリデータが起動した後、一度関数を実行する方法はありますか?mvc3検証が完了すると、検証機能が実行されます

理想的には、settngs.errorPlacementを実行してそれに応じてエラーを配置し、それが完了したら別の関数を1回だけ実行します。現時点では、settngs.errorPlacement内から関数を呼び出していますが、すべてのエラーに対して実行されています。これはパフォーマンスにヒットします。

喜んでお寄せいただきありがとうございます。

更新MVCで控えめなクライアント側の検証の火災は、各バリデータが成功またはerrorPlacement機能のいずれかを呼び出します

。基本的に、ページに15個のバリデータがある場合、これらの関数のいずれかがバリデータごとに実行されます(つまり、7成功、8エラー、5成功、10エラー)。私がしたいのは、バリデータがループされた後に関数が呼び出され、successとerrorPlacement関数がそこで実行された後に関数を呼び出すことです...

私は関数を15回呼びます私はそれが一度だけ実行される場所に関数を置くことができる場所を把握することはできません。

+0

私には少なくとも、あなたがしたいことはあまり明確ではありません。コードサンプルを追加したり、少し明確にすることができますか? –

+0

更新が追加されました - うまくいけば、これはより明確な説明です! – Sniffer

答えて

1

これらのオプションはありませんが、既存の関数formなどをオーバーライドすることで可能です。

var originalForm = $.validator.prototype.form; 
$.validator.prototype.form = function() { 
    var returnValue = originalForm.call(this); 
    if(!returnValue) { 
     //do my custom invalid handling here 
    } 
    return returnValue; 
} 

私はこのコードをテストしていませんが、私はバイオリンを設置しようとしますが、私はまだそれを使用していないよう控えめな実装はMVC3でどのように見えるのは100%確実ではないです。出力HTML/JSのモックアップを使っていたら、おそらくそれを理解することができます。

+0

それは素晴らしいです。これは標準的な 'Html.BeginForm()'フォームと控えめなJSを使った 'Ajax.BeginForm(...)' AJAXフォームを使って、限られたテストで動作します。 'submit'ハンドラに干渉することはないので、' bind() '/' unbind() '、' live() '/' die() '、' delegate() 'の処理について心配する必要はありません。/'undelegate()'、 'on()'/'off()'イベントハンドラを使用します。 – nekno

1

jquery.validate.jsのdefaultShowErrors関数を置き換え、ミラーリングして、配置機能に呼び出しを追加することをお勧めします。 defaultShowErrorsは、検証が実行された後、単一の要素かフォーム全体かにかかわらず呼び出されます。

のJavaScriptファイル( jquery.validate.js後を挿入)にするか、ページのスクリプトで次の行を追加します。

$.extend($.validator.prototype, { 
    defaultShowErrors: function() { 
     for (var i = 0; this.errorList[i]; i++) { 
      var error = this.errorList[i]; 
      this.settings.highlight && this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass); 
      this.showLabel(error.element, error.message); 
     } 
     if(this.errorList.length) { 
      this.toShow = this.toShow.add(this.containers); 
     } 
     if (this.settings.success) { 
      for (var i = 0; this.successList[i]; i++) { 
       this.showLabel(this.successList[i]); 
      } 
     } 
     if (this.settings.unhighlight) { 
      for (var i = 0, elements = this.validElements(); elements[i]; i++) { 
       this.settings.unhighlight.call(this, elements[i], this.settings.errorClass, this.settings.validClass); 
      } 
     } 
     this.toHide = this.toHide.not(this.toShow); 
     this.hideErrors(); 
     this.addWrapper(this.toShow).show(); 

     // INSERT CALL TO YOUR CUSTOM PLACEMENT FUNCTION HERE 
    } 
}); 
4

jQueryの検証プラグインは、イベントハンドラでフォームsubmitイベントをフック提出する前にそのフォームを検証するためにvalidate()関数を呼び出し、検証が失敗した場合にフォームの送信を防止します。

jQueryを使用して各フォームのsubmitイベントをフックし、フォームの下部に表示すると、プラグインハンドラの前に実行する独自のハンドラが追加されます。こうすることで、フォーム上でvalid()関数を呼び出すことができ、完全なフォーム検証後に必要なカスタムコードを実行することができます。プラグインのvalid()関数は、フォーム上でvalidate()関数を呼び出し、成功/失敗のブール値を返します。成功/失敗を気にしない場合は、valid()の代わりにvalidate()に直接電話することができます。

フォームでvalid()またはvalidate()を呼び出すと、MVC3の控えめなクライアント検証でフォームが検証エラーでマークアップされますが、呼び出し後に何か他の操作を実行できるようになります。

私自身のsubmit()ハンドラ(下記)とjQuery検証プラグインvalidate()valid()の関数にブレークポイントを設定しました。この実装では一度呼び出されるだけですので、完全なフォームの検証は複数回実行してはいけません。

もちろん、プラグインはfocus、blur、keyup、clickイベントもフックしているため、個々のフィールドのバリデーターはすでに複数回呼び出されているため、失敗/解決されたフォームフィールドについてユーザーに即座にフィードバックが提供されます。検証は、ユーザがフィールドに値を入力するまで実行されないという点で、怠惰です。ユーザーが値を入力してフィールドを離れると、フィールドは有効になります。フィールドが無効とマークされている場合、無効なフィールドが有効であることが判明するまで、さまざまなイベントで繰り返し検証されるため、再検証が賢明です。

ページの下部にある、すべてformタグの下に次の文字を挿入します。書かれているように、$("form")セレクタでは、ページ内のすべてのform要素の送信イベントを処理します。もちろん、jQueryセレクタを使用して、特定のformタグを検証用に選択することができます。検証を実行するときはいつでも、フォーム上でvalid()またはvalidate()と呼んで、一度実行するコードを実行してください。

<form> 
... 
</form> 

<script type="text/javascript"> 
    $("form").submit(function (e) { 
     if ($(this).valid() == false) { 
      alert("yo!"); // execute anything you want following validation 
     } 
    }); 
</script> 

それとも、検証の結果を知っている気にしない場合:あなたのクラス定義の上[SessionState(SessionStateBehavior.Default)]を入れて、

<script type="text/javascript"> 
    $("form").submit(function (e) { 
     $(this).validate(); 
     alert("yo!"); // execute anything you want following validation 
    }); 
</script> 
+0

+1これははるかに簡単な方法です。 – Olivier

-1

を、その後if (Session.IsNewSession == true)をチェック

は、検証の結果を取得するにはそれは初めて実行されるだけです。 機能を省略して if (Session["somevariable"] == "somevalue")にチェックする場合は、 Session["somevariable"] = "somevalue"を設定することもできます。そうすれば、あなたの機能を実行しなければならない場合、あなたはきちんとトグルすることができます。

+0

Snifferは、クライアント側の検証の後、またはブラウザのクライアント側のイベントの後に実行されるクライアント側の機能を探しています。 C#サーバーコードは適用されません。 – nekno

関連する問題