6

$.ajax を使用して同じページの WebMethod をクエリし、結果が true か false かを示すブール値を返す .NET カスタム バリデーターを実装しようとしています。

私が使用しているWebMethodは本当にシンプルです

[WebMethod()]
public static bool IsPromoValid(string code)
{
    string promoCode = "ABCDEFG";
    bool result = code.ToLower() == promoCode.ToLower();
    return result;
}

CustomValidator は次のようになります

<asp:CustomValidator ID="cvPromoCode" Display="None" ControlToValidate="txtPromoCode" runat="server" ClientValidationFunction="validatePromo"
    ErrorMessage="The promo code you entered is incorrect" OnServerValidate="ValidatePromoCode" />

そして単純な $.ajax() ClientValidation関数

function validatePromo(src, args) {
    $.ajax({
        type: "POST",
        url: "Register.aspx/IsPromoValid",
        data: "{'code': '" + args.Value + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            args.IsValid = msg.d;
        }
    });
}

問題は、ページが即座に検証され、実際には ajax 呼び出しが終了するのを待たないことです。ページに他のエラーがある場合は、検証の概要が表示されますが、カスタム バリデーターからのエラー メッセージは表示されません。

AJAX 呼び出しがFirebugで行われていることがわかり、正しい応答 (この場合はtrueまたはfalse )が返されます。

4

1 に答える 1

8

簡単な方法は、検証を次のように変更することです。

 function validatePromo(src, args) {
    var isValid;
    $.ajax({
        type: "POST",
        url: "Register.aspx/IsPromoValid",
        data: "{'code': '" + args + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: false,
        success: function (msg) {
             isValid = msg.d;
        }        
    });
    args.IsValid = isValid;
}

に特に注意してくださいasync:false。最初の試行がうまくいかなかった理由は、検証スクリプトが args.IsValid をチェックするまで ajax 成功コールバックが呼び出されなかったためです。async:false を使用すると、$.ajax 呼び出しは、成功のコールバックが完了するまで完了しません。

これに関する大きな問題は、検証を実行している js スレッドが何であれ、「ブロック」されることです。ASP.Net バリデーターの場合、これが問題になるとは思いませんが、接続が遅い人のためにページを台無しにしないようにするためだけに、実行時間の長い呼び出しでテストします。

于 2010-10-20T21:34:12.383 に答える