2009-09-18 12 views
0

MVCでjValを使用しており、jqueryが検証しています。私はajax呼び出しを行うカスタムバリデーターに到達するまで、すべてうまく動作します。XVal、JQuery Validate、Ajax oh my!

ajax呼び出しは、firbug Netタブに従って適切な値を返します。しかし、何かが間違っていると私はそれを把握することはできません。

ここJavaScriptコードは次のとおり

function CheckEmail() { 
    var res; 
    $.ajax({ 
     type: "GET", 
     url: "/User/CheckEmail", 
     data: "email=" + $('#EmailAddress').val(), 
     success: function(result) { 
      res = result; 
     } 
    }); 
    if (res == "True") { 
     return true; 
    } 
    else { 
     return false; 
    } 

}私は放火犯とを介してステップ場合、未定義表示されRES

。私はそれが問題だと思う。

このコードを再編成して変更するのに4時間を費やしましたが、何も正しく動作しないようです。

if文を実行するためにajaxが完了するまで待機していないという理論があります。誰でもそれを確認したり拒否できますか?

+0

xValをチェックアウトするとよいでしょう。あなたのドメイン検証ルールを使用してビュー内にjQuery検証スクリプトを生成します(サーバー側の検証も行います)。 http://blog.codeville。net/2009/09/17/xval-v10-now-available/ – jrummell

+0

この関数は、カスタムサーバー側の検証属性に対応するxValとともに呼び出されています。 – Patricia

+0

Alright。私はxVal(1.0)の新しいバージョンがリモートルールタイプを持っていることを知りました。あなたはそれについてsteveのブログですべて読むことができます:http://blog.codeville.net/2009/09/17/xval-v10-now-available/ それは私にとって問題を解決しました。 – Patricia

答えて

1

Webサーバーへの同期呼び出しは必要ありません。ユーザのブラウザは応答を待っている間にロックされるため、可能な限り避けてください。

最近、私はblog article about remote client-side validation(達成しようとしているもの)を書いています。非同期要求でこれを行う方法を示しています。

+0

linKのおかげで!これはブラウザを待っている方がはるかに良い解決策のように見えます。はるかにユーザーフレンドリー。私は今すぐ実装しようとしています! – Patricia

2

Ajaxの 'A'は非同期を表します。その後

$.ajax(...); 
if (res == "True") {   
    return true;  
} else {   
    return false;  
} 

以降(のように、後でミリ秒)でのAjaxリクエストが戻ってくると呼び出します:

何が起こっていることは、あなたのコードは次のように呼ば取得され

function(result) { 
    res = result;   
} 

一部を示唆していますAjaxの呼び出しを非同期にしていますが、リクエストが戻ってくるまで何か他のことが起こらないようにします。これは多くの理由で悪いことがあります。

ベスト・ソリューションは、Ajaxリクエストを作成して送信する関数ではなく、検証ロジックをコールバックに入れることです。

例:

function CheckEmail() {  
    $.ajax({   
     type: "GET",   
     url: "/User/CheckEmail",   
     data: "email=" + $('#EmailAddress').val(),   
     success: function(result) {    
      if (result == "True") { 
       doSomethingPositive(); 
      } else { 
       warnUserInvalidEmail(); 
      } 
     }  
    });  
} 
+0

これはxValで使用されていないが、xValに対してtrue/falseを返す必要がある場合にはうまくいくでしょう。 – Patricia

2

はい、あなたは正しいです。 $.ajax()はデフォルトでは非同期呼び出しです。 async:falseを追加すると、同期させることができます。

$.ajax({ 
    type: "GET", 
    async: false, 
    url: "/User/CheckEmail", 
    data: "email=" + $('#EmailAddress').val(), 
    success: function(result) { 
     res = result; 
    } 
}); 
+0

これは実際には行く方法だと思います。 b/c xValがこの関数からtrueまたはfalseを返す必要があります。 zulrangのソリューションはそれを可能にしません。 – Patricia

0

少し遅れますが、私が言うことができるのは、Ajaxフォームの検証を避けることです。恐ろしいユーザーエクスペリエンスを作り出します。 フォームに50個のフィールドがあり、インタラクティブな検証が必要な場合は、ユーザーがフィールドを完了するたびにスクリプトがサーバーに電話をかけます。 Firebugを開いて見て、ショックを与えないでください。

+0

確かに、サーバー上で50個のフィールドが検証されているのは明らかに悪い考えですが、一意のユーザー名チェックまたは同様のスタイルがサーバーに当てはまる必要があります。 – Patricia

関連する問題