Пользовательский валидатор ASP.NET + WebMethod + jQuery

Я пытаюсь реализовать пользовательский валидатор .NET, который использует $.ajax для запроса 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)


person Marko    schedule 20.10.2010    source источник


Ответы (1)


простой способ — изменить валидацию на:

 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. Причина, по которой ваша первая попытка не сработала, заключается в том, что обратный вызов успеха ajax не вызывался до тех пор, пока сценарии проверки не проверили args.IsValid. С async:false вызов $.ajax не завершится до тех пор, пока не будет выполнен обратный вызов успеха.

Большая проблема заключается в том, что теперь он «блокирует» любой поток js, выполняющий проверку. В случае с валидаторами ASP.Net я не думаю, что это проблема, но я бы проверил это с помощью длительного вызова, просто чтобы убедиться, что вы не испортите свою страницу для кого-либо с медленным соединением.

person Philip Rieck    schedule 20.10.2010
comment
Просто примечание: я не использую переменную isValid согласно вашему ответу, я просто изменил асинхронность на ложь. Я получал неверный код, хотя msg.d возвращался как истинный. - person Marko; 21.10.2010