2010-10-20 28 views
5

Estoy tratando de implementar un Validador .NET personalizado que use $ .ajax para consultar un WebMethod en la misma página y devolver un valor booleano para indicar si el resultado es verdadero o falso .Validador personalizado de ASP.NET + WebMethod + jQuery

El WebMethod que estoy usando es muy simple

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

El CustomValidator se parece a esto

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

y el simple $ .ajax() ClientValidation función

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

El problema es que la página se valida instantáneamente y no espera a que termine la llamada ajax. Si hay otros errores en la página, muestra el Resumen de validación con ellos, pero nunca muestra el mensaje de error del Validador personalizado.

puedo ver la llamada AJAX que se realizan en Firebug, y returs la respuesta correcta (en este caso cierto o falsa)

Respuesta

8

El manera fácil es cambiando su validación a :

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

Tome nota especial de async:false. La razón por la que su primer intento no funcionó es porque la devolución de llamada de éxito de ajax no se llamaba hasta que los scripts de validación ya habían verificado args.IsValid. Con async: false, la llamada $ .ajax no se completará hasta que se complete la devolución de llamada exitosa.

El gran problema con esto es que ahora "bloquea" cualquier hilo js que ejecute la validación. En el caso de los validadores de ASP.Net, no creo que esto sea un problema, pero lo probaría con una llamada de larga duración solo para asegurarme de que no está arruinando su página para alguien con una conexión lenta.

+2

Boom! Eso es todo tío :) – Marko

+0

Solo una nota, no estoy usando la variable isValid según tu respuesta. Acabo de cambiar la asincronía a falso. Obtenía el "Código incorrecto" aunque msg.d volvía a ser verdadero. – Marko

Cuestiones relacionadas