Perché il valore di campo errato viene visualizzato nel messaggio di errore quando si utilizza la convalida jQuery (remota)?
-
06-07-2019 - |
Domanda
Sto usando il plugin di validazione jQuery in un modo molto simile al Remember The Milk demo.
$("#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 prima volta che viene inviata un'email non valida (ad es. bob@mail.com), il messaggio di errore è come previsto. Tuttavia, se inserisco un'altra e-mail non valida (ad esempio sue@mail.com), il plug-in di convalida visualizza ancora " bob@mail.com è già in uso. & Quot;
Ho rintracciato i parametri che stanno raggiungendo il controller specificato nella chiamata Url.Action
e sono sicuramente corretti (ovvero " sue@mail.com" viene inviato come indirizzo email quando quello è ciò che viene inserito nel campo).
Qualcun altro ha riscontrato questo o un problema simile utilizzando il plug-in di convalida jQuery?
Soluzione
Il campo del nome utente nella demo di Remember the Milk ha esito negativo allo stesso modo (quando si inseriscono i nomi utente 'Peter' e 'George'), quindi probabilmente hai trovato un bug nel plugin.
Altri suggerimenti
Oltre due anni dopo e il bug non sembra essere stato corretto, quindi ecco cosa ho trovato:
Il problema è nella funzione remote
:
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...
}
Il problema è che nella seconda e successiva valutazione di questa funzione, il messaggi [element.name] .remote
contiene un messaggio di errore specifico (testo) e il effettivo il messaggio originale viene perso per sempre quando previous.originalMessage
viene sovrascritto successivamente.
Sono stato in grado di aggirare il problema aggiungendo un segno di spunta prima di quella riga:
if (!previous.originalMessage)
previous.originalMessage = this.settings.messages[element.name].remote;
Non sono sicuro che questa sia davvero la soluzione corretta , ma funziona: gli errori di convalida ora riapplicano la funzione di formattazione su ogni errore di convalida.