2010-10-20 15 views
5

Sto cercando di implementare un validatore personalizzato .NET che utilizza $ .ajax per interrogare un WebMethod sulla stessa pagina e restituire un valore booleano per indicare se il risultato è vero o falso .Validatore personalizzato ASP.NET + WebMethod + jQuery

Il WebMethod che sto utilizzando è davvero semplice

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

Il CustomValidator assomiglia a questo

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

E il semplice $ .ajax() ClientValidation funzione

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

Il problema è che la pagina si convalida istantaneamente e in realtà non aspetta che la chiamata ajax termini. Se ci sono altri errori nella pagina, mostra il Riassunto della convalida con loro, ma non mostra mai il messaggio di errore dal Custom Validator.

posso vedere la chiamata AJAX compiuti in Firebug, e returs la risposta giusta (in questo caso vero o falsa)

risposta

8

Il facile modo è cambiando la Convalida per :

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

Prendere nota speciale del async:false. Il motivo per cui il tuo primo tentativo non ha funzionato è che il callback di successo di ajax non è stato chiamato fino a quando gli script di convalida non avessero già controllato argomenti.IsValid. Con async: false, la chiamata $ .ajax non verrà completata fino a quando non viene eseguita la richiamata di successo.

Il grosso problema con questo è che ora "blocca" qualsiasi thread js sta eseguendo la convalida. Nel caso dei validatori ASP.Net, non credo che questo sia un problema, ma lo testerei con una chiamata di lunga durata solo per assicurarmi di non rovinare la tua pagina per nessuno su una connessione lenta.

+2

Boom! Quello è il tizio :) – Marko

+0

Solo una nota, non sto usando la variabile isValid come da tua risposta ho appena cambiato async in falso. Stavo ottenendo "Codice errato" anche se msg.d tornava come vero. – Marko

Problemi correlati