2011-06-25 12 views
1

私は検証のためにmvc 2と注釈付き.net 4を使用しています。自分のデータベースに電子メールがすでに存在するかどうかを確認するために、独自のvalidationAttributeを構築しました。 ismailexisting()のc#関数は正しい値を返しますが、javascriptは正しく動作しません。 jqueryのパート/ javascriptのは、次のようになります。.net mvc jquery clientside検証問題

Sys.Mvc.ValidatorRegistry.validators["isexisting"] = function (rule) { 
     return function (value, context) { 
      $.ajax({ 
       url: "/persons/ismailexisting", 
       type: "POST", 
       data: { email: value }, 
       success: function (data) { 
        //alert("success: " + data); 
        if (data == "yes") { 
         return false; 
        } 
       } 
      }) 
      return true; 
      return rule.ErrorMessage; 
     }; 
    }; 

メールが既に存在する場合、関数ismailexisting()の戻り「はい」、そうでない場合は「いいえ」。 電子メールが存在する場合(データが「はい」なので)、javascriptは他の電子メールを入力する必要があるため、ユーザーが続行できないようにする必要があります。 alert()のコメントを外すと、データの値が正しいです。しかし、somethingsは私の見解に正しい結果を提供することからjavascriptを遠ざけています。

その他のカスタムバリデーションを既に実装しているため、カスタムバリデーション用のその他のものはすべて正しく実装されています。

ありがとうございます!

+0

MVC3にアップグレードする可能性はありますか? MVCの 'RemoteAttribute'はあなたが達成しようとしているものとまったく同じです。 – tvanfosson

答えて

0

デフォルトでは、AJAX呼び出しは非同期であるため、コールバックから関数の値を返すことはできません。この関数は、AJAX呼び出しが応答を返す前に値trueを返しました。これを回避するには、AJAX呼び出しのオプションにasync: falseを設定します。これは、サーバーからの応答を待っている間に他のjavascriptがページ上で実行されるのを防ぐので、注意して使用してください。また、コールバックの戻り値は、その関数からのみ返され、囲みバリデータ関数では返されないことにも注意してください。キャプチャされた変数の値を外側のスコープから設定し、その変数の値をバリデータから返します。

Sys.Mvc.ValidatorRegistry.validators["isexisting"] = function (rule) { 
    return function (value, context) { 
     var result = true; 
     $.ajax({ 
      url: "/persons/ismailexisting", 
      type: "POST", 
      async: false, // force the call to run synchronously 
      cache: false, // we probably don't want to use a cached result 
      data: { email: value }, 
      success: function (data) { 
       //alert("success: " + data); 
       if (data == "yes") { 
        // set captured value for return 
        result = false; 
       } 
      } 
     }) 
     return result; 
     //return rule.ErrorMessage; // you'll never reach this... 
    }; 
}; 
+0

ありがとうございますが、これはまだ100%正しく動作しません。私が「警告(結果);帰りの前に、それは動作します! - 何か案は? –

+0

@Jacques - 私はタイプミスがあったと思う。 'async:false'でなければなりません。なぜ私はそれがaSyncだと思ったのか分かりません。 http://api.jquery.com/jQuery.ajax/ – tvanfosson

+0

の文書を参照してください、今チャーミーのように、ドイツからの大きな感謝:) –