2010-10-20 7 views
5

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

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. Если на странице есть какие-либо другие ошибки, она показывает с ними сводку проверки, но никогда не отображает сообщение об ошибке из Custom Validator.

Я могу видеть вызов AJAX, вносимый в Firebug, и returs правильный ответ (в данном случае верно или ложные)

ответ

8

легко путь является, изменив Validate на :

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

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

+2

Boom! Вот это чувак :) – Marko

+0

Просто заметьте, я не использую переменную isValid в соответствии с вашим ответом. Я просто изменил async на false. Я получал «Неверный код», хотя msg.d возвращался как истинный. – Marko