Pourquoi la valeur de champ incorrecte est-elle affichée dans le message d'erreur lors de l'utilisation de la validation jQuery (à distance)?

StackOverflow https://stackoverflow.com/questions/1626998

Question

J'utilise le plug-in de validation jQuery de manière très similaire à celle de Remember The Milk démo .

$("#registrationForm").validate({
  rules: {      
    email: {
      required: true,
      email: true,
      remote: '<%=Url.Action(...) %>'
    },        
  },
  messages: {
    email: {
      required: "Please enter an email address",
      email: "Please enter a valid email address",
      remote: jQuery.format("{0} is already in use")
    }
});

La première fois qu'un e-mail non valide (par exemple, bob@mail.com) est envoyé, le message d'erreur est tel que prévu. Cependant, si je saisis un autre courrier électronique non valide (par exemple, sue@mail.com), le plug-in de validation affiche toujours "bob@mail.com est déjà utilisé".

J'ai tracé les paramètres qui atteignent le contrôleur spécifié dans l'appel Url.Action et ils sont définitivement corrects (c'est-à-dire "sue@mail.com" est envoyé en tant qu'adresse e-mail lorsque correspond à ce qui est entré dans le champ).

Quelqu'un d'autre a-t-il rencontré ce problème ou un problème similaire en utilisant le plug-in de validation jQuery?

Était-ce utile?

La solution

Le champ du nom d'utilisateur de la démonstration de Remember the Milk échoue de la même manière (lors de la saisie des noms d'utilisateur "Peter" et "George"), vous avez donc probablement trouvé un bogue dans le plugin.

Autres conseils

Plus de deux ans plus tard et le bogue ne semble toujours pas corrigé, voici ce que j'ai trouvé:

Le problème se trouve dans la fonction à distance :

remote: function(value, element, param) {
    if ( this.optional(element) )
        return "dependency-mismatch";

    var previous = this.previousValue(element);
    if (!this.settings.messages[element.name] )
        this.settings.messages[element.name] = {};
    previous.originalMessage = this.settings.messages[element.name].remote;
    this.settings.messages[element.name].remote = previous.message;

    // snip more code...
}
Le problème est que lors de la deuxième évaluation et des évaluations ultérieures de cette fonction, les messages [nom.élément] .remote contiennent un message d'erreur spécifique (texte) et le réel Le message d'origine est définitivement perdu lorsque previous.originalMessage est écrasé par la suite.

J'ai pu contourner le problème en ajoutant un contrôle avant cette ligne:

if (!previous.originalMessage)
    previous.originalMessage = this.settings.messages[element.name].remote;

Je ne sais pas s'il s'agit vraiment de la solution correcte , mais cela fonctionne: les échecs de validation réappliquent maintenant la fonction de formatage à chaque échec de validation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top