¿Por qué se muestra el valor de campo incorrecto en el mensaje de error cuando se usa la validación jQuery (remota)?

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

Pregunta

Estoy usando el complemento de validación jQuery de manera muy similar 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 primera vez que se envía un correo electrónico no válido (por ejemplo, bob@mail.com), el mensaje de error es el esperado. Sin embargo, si luego ingreso otro correo electrónico no válido (por ejemplo, sue@mail.com), el complemento de validación aún muestra "bob@mail.com ya está en uso".

He rastreado los parámetros que están llegando al controlador especificado en la llamada Url.Action y definitivamente son correctos (es decir, " sue@mail.com" se envía como la dirección de correo electrónico cuando es lo que se ingresa en el campo).

¿Alguien más se ha encontrado con este u otro problema similar usando el complemento de validación jQuery?

¿Fue útil?

Solución

El campo de nombre de usuario en la demostración Remember the Milk falla de la misma manera (al ingresar los nombres de usuario 'Peter' y 'George'), por lo que probablemente haya encontrado un error en el complemento.

Otros consejos

Más de dos años después y el error todavía no parece estar solucionado, así que esto es lo que encontré:

El problema está en la función remota :

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

El problema es que en la segunda y posteriores evaluaciones de esta función, los mensajes [element.name] .remote contienen un mensaje de error específico (texto) y el actual el mensaje original se pierde para siempre cuando previous.originalMessage se sobrescribe después de eso.

Pude solucionar el problema agregando un cheque antes de esa línea:

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

No estoy seguro de si esta es realmente la solución correcta , pero funciona: las fallas de validación ahora vuelven a aplicar la función de formato en cada falla de validación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top