2009-09-18 12 views
0

J'utilise xVal avec MVC et jquery validate. Tout fonctionne bien, jusqu'à ce que j'arrive à mon validateur personnalisé qui fait un appel ajax.XVal, JQuery Valider, et Ajax oh mon!

l'appel ajax renvoie la bonne valeur, en fonction de l'onglet net Firbug. Mais quelque chose ne va pas et je ne peux pas le comprendre.

Voici le code javascript:

function CheckEmail() { 
    var res; 
    $.ajax({ 
     type: "GET", 
     url: "/User/CheckEmail", 
     data: "email=" + $('#EmailAddress').val(), 
     success: function(result) { 
      res = result; 
     } 
    }); 
    if (res == "True") { 
     return true; 
    } 
    else { 
     return false; 
    } 

}

quand je fais un pas à travers avec Firebug, res est montrant comme non défini. Je pense que c'est le problème.

J'ai passé 4 heures à réorganiser et modifier ce code et rien ne semble le faire fonctionner correctement.

J'ai une théorie selon laquelle il n'attend pas que l'ajax soit exécuté pour exécuter l'instruction if. Quelqu'un peut-il confirmer ou infirmer cela?

+0

Vous voudrez peut-être vérifier xVal. Il utilise vos règles de validation de domaine pour générer des scripts de validation jQuery dans vos vues (il effectue également la validation côté serveur). http: //blog.codeville.net/2009/09/17/xval-v10-now-available/ – jrummell

+0

Cette fonction est appelée avec xVal pour correspondre à un attribut de validation côté serveur personnalisé :) – Patricia

+0

D'accord. J'ai découvert que la nouvelle version de xVal (1.0) a un type de règle à distance. Vous pouvez lire tout sur le blog de Steve: http://blog.codeville.net/2009/09/17/xval-v10-now-available/ Il a résolu le problème pour moi. – Patricia

Répondre

1

Vous n'avez pas besoin d'un appel synchrone sur votre serveur Web. Vous devriez les éviter autant que possible, car le navigateur de l'utilisateur sera verrouillé pendant qu'il attend la réponse.

J'ai récemment écrit un blog article about remote client-side validation (exactement ce que vous essayez d'obtenir) montrant comment faire cela avec une requête asynchrone.

+0

Merci pour le linK! Cela ressemble à une solution beaucoup mieux alors avoir le navigateur en attente. beaucoup plus convivial. Je vais essayer de l'implémenter maintenant! – Patricia

2

Le 'A' dans Ajax signifie Asynchrone.

Ce qui se passe est, votre code s'appelle comme ceci:

$.ajax(...); 
if (res == "True") {   
    return true;  
} else {   
    return false;  
} 

Puis, plus tard (comme, millisecondes plus tard) la demande ajax revient et appelle:

function(result) { 
    res = result;   
} 

Certains suggèrent rendre l'appel Ajax asynchrone, mais cela empêchera toute autre chose de se produire dans le navigateur jusqu'à ce que la requête revienne, ce qui peut être mauvais pour plusieurs raisons.

La meilleure solution serait de mettre votre logique de validation dans le rappel, et non dans la fonction qui crée et envoie la requête Ajax.

Exemple:

function CheckEmail() {  
    $.ajax({   
     type: "GET",   
     url: "/User/CheckEmail",   
     data: "email=" + $('#EmailAddress').val(),   
     success: function(result) {    
      if (result == "True") { 
       doSomethingPositive(); 
      } else { 
       warnUserInvalidEmail(); 
      } 
     }  
    });  
} 
+0

cela fonctionnerait très bien s'il n'était pas utilisé par xVal mais il doit retourner vrai/faux pour xVal – Patricia

2

Oui, vous avez raison. $.ajax() est un appel asynchrone par défaut. Vous pouvez ajouter async: false pour le rendre synchrone.

$.ajax({ 
    type: "GET", 
    async: false, 
    url: "/User/CheckEmail", 
    data: "email=" + $('#EmailAddress').val(), 
    success: function(result) { 
     res = result; 
    } 
}); 
+0

Je pense que cela pourrait effectivement être le chemin à parcourir. b/c j'ai besoin de retourner true ou false depuis cette fonction pour xVal pour l'utiliser. et la solution de zulrang ne peut pas permettre cela. – Patricia

0

Un peu en retard, mais tout ce que je peux dire, c'est éviter la validation de la forme ajax - cela crée une expérience utilisateur terrible. Pensez-y de cette façon, si vous avez 50 champs dans votre formulaire et que vous voulez une expérience de validation interactive, votre script appellera votre serveur chaque fois que l'utilisateur remplira un champ. Ouvrez Firebug et jetez un coup d'oeil, ne soyez pas choqué.

+0

oui, avoir 50 champs valider sur le serveur est évidemment une mauvaise idée, mais un contrôle de nom d'utilisateur unique, ou un style similaire doit frapper le serveur. – Patricia