0

私はMVCとjqueryvalidateでxValを使用しています。ajax呼び出しを行うカスタムバリデーターに到達するまで、すべてうまく機能します。

firbugの[ネット]タブによると、ajax呼び出しは正しい値を返します。しかし、何かがうまくいかず、私はそれを理解することができません。

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時間ほど費やしましたが、何も正しく機能しないようです。

私は、ajaxがifステートメントを実行するまで待機していないという理論を持っています。誰かがそれを確認または否定できますか?

4

4 に答える 4

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();
            }
        }    
    });    
}
于 2009-09-18T20:07:54.733 に答える
2

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

$.ajax({
    type: "GET",
    async: false,
    url: "/User/CheckEmail",
    data: "email=" + $('#EmailAddress').val(),
    success: function(result) {
        res = result;
    }
});
于 2009-09-18T20:08:26.790 に答える
1

Web サーバーへの同期呼び出しは必要ありません。応答を待っている間、ユーザーのブラウザーがロックされるため、これらはできるだけ避ける必要があります。

私は最近、非同期リクエストでこれを行う方法を示す、リモートクライアント側の検証 (まさにあなたが達成しようとしていること)に関するブログ記事を書きました。

于 2009-10-01T21:43:36.183 に答える
0

少し遅れますが、私が言えるのは、ajaxフォームの検証を避けることだけです-それはひどいユーザーエクスペリエンスを生み出します。このように考えてください。フォームに50個のフィールドがあり、インタラクティブな検証エクスペリエンスが必要な場合、ユーザーがフィールドに入力するたびに、スクリプトがサーバーを呼び出します。Firebugを開いて見てください、ショックを受けないでください。

于 2011-06-02T23:05:33.827 に答える