2010-10-20 19 views
5

J'essaie d'implémenter un validateur .NET personnalisé qui utilise $ .ajax pour interroger un WebMethod sur la même page et retourner une valeur booléenne pour indiquer si le résultat est vrai ou faux .Validateur personnalisé ASP.NET + WebMethod + jQuery

WebMethod J'utilise est très simple

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

Le CustomValidator ressemble à ceci

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

Et simple .ajax $() ClientValidation fonction

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

Le problème est que la page est validée instantanément et n'attend pas que l'appel ajax se termine. S'il y a d'autres erreurs sur la page, il affiche le résumé de validation avec eux, mais ne montre jamais le message d'erreur du validateur personnalisé.

Je peux voir l'appel AJAX réalisés dans Firebug, et il returs la bonne réponse (dans ce cas vrai ou faux)

Répondre

8

Le facile moyen est en changeant votre 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; 
} 

Veuillez prendre note du async:false. La raison pour laquelle votre premier essai n'a pas fonctionné est que le rappel de succès ajax n'a pas été appelé avant que les scripts de validation aient déjà vérifié args.IsValid. Avec async: false, l'appel $ .ajax ne se terminera qu'après la fin du rappel.

Le gros problème avec ceci est qu'il "bloque" tout thread js qui exécute la validation. Dans le cas des validateurs ASP.Net, je ne crois pas que ce soit un problème, mais je le testerais avec un appel de longue durée juste pour m'assurer que vous ne feriez pas une erreur dans votre page pour quelqu'un avec une connexion lente.

+2

Boom! C'est juste mec :) – Marko

+0

Juste une note, je n'utilise pas la variable isValid selon votre réponse je viens de changer async en false. Je recevais "Code incorrect" même si msg.d revenait comme vrai. – Marko