2010-10-20 29 views
5

Tôi đang cố triển khai .NET Custom Validator sử dụng $ .ajax để truy vấn một WebMethod trên cùng một trang và trả về giá trị boolean để cho biết kết quả là đúng hay sai .ASP.NET Custom Validator + WebMethod + jQuery

Các WebMethod Tôi đang sử dụng là thực sự đơn giản

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

Các CustomValidator trông như thế này

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

Và đơn giản $ .ajax() ClientValidation chức năng

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; 
     } 
    }); 
} 

Vấn đề là trang xác thực ngay lập tức và không thực sự chờ cuộc gọi ajax kết thúc. Nếu có bất kỳ lỗi nào khác trên trang, nó sẽ hiển thị Tóm tắt xác thực với chúng, nhưng không bao giờ hiển thị thông báo lỗi từ Trình xác thực tùy chỉnh.

tôi có thể thấy các cuộc gọi AJAX được thực hiện trong Firebug, và nó returs phản ứng ngay (trong trường hợp này đúng hoặc sai)

Trả lời

8

Các dễ Cách thứ nhất là bằng cách thay đổi Validate của bạn để :

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; 
} 

Ghi chú đặc biệt của async:false. Lý do mà lần thử đầu tiên của bạn không hoạt động là cuộc gọi lại thành công ajax không được gọi cho đến sau khi các tập lệnh xác thực đã kiểm tra args.IsValid. Với async: false, cuộc gọi $ .ajax sẽ không hoàn thành cho đến khi lệnh gọi lại thành công được thực hiện.

Vấn đề lớn với điều này là bây giờ nó "chặn" bất kỳ chuỗi js nào đang chạy xác thực. Trong trường hợp trình xác nhận ASP.Net, tôi không tin đây là vấn đề nhưng tôi sẽ thử nghiệm nó với một cuộc gọi dài để đảm bảo rằng bạn không làm hỏng trang của mình cho bất kỳ ai có kết nối chậm.

+2

Bùng nổ! Đó là nó dude :) – Marko

+0

Chỉ cần một lưu ý, tôi không sử dụng biến isValid theo câu trả lời của bạn tôi chỉ thay đổi async thành false. Tôi đã nhận được "Mã không chính xác" mặc dù msg.d đã trở lại là đúng sự thật. – Marko

Các vấn đề liên quan