ASP.NET Custom Validator + WebMethod + jQuery - PullRequest
       10

ASP.NET Custom Validator + WebMethod + jQuery

6 голосов
/ 21 октября 2010

Я пытаюсь реализовать .NET Custom Validator, который использует $ .ajax для запроса WebMethod на той же странице и возвращает логическое значение, чтобы указать, является ли результат истинным или ложным.

Используемый мной 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 )

1 Ответ

8 голосов
/ 21 октября 2010

Способ easy заключается в изменении вашей проверки на:

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

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

...