Por que é o valor do campo errado mostrado na mensagem de erro ao usar jQuery validação (remoto)?

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

Pergunta

Eu estou usando o jQuery validação plug-in de uma forma muito semelhante ao Remember The Milk demonstração .

$("#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")
    }
});

A primeira vez que um e-mail inválido (por exemplo bob@mail.com) é enviada, a mensagem de erro é como esperado. No entanto, se eu, em seguida, entrar em outro e-mail inválido (por exemplo sue@mail.com), a validação do plugin ainda exibe "bob@mail.com já está em uso."

Eu já traçou os parâmetros que estão atingindo o controlador especificado na chamada Url.Action e eles são definitivamente correta (ou seja, "sue@mail.com" é enviado como o endereço de e-mail quando é isso que está inserido no campo).

Tem mais alguém executar para esse ou um problema semelhante usando o jQuery validação plugin?

Foi útil?

Solução

O campo de nome de usuário no Remember the Milk demonstração falhar da mesma forma (ao digitar nomes de usuários 'Peter' e 'George'), então você provavelmente encontrou um bug no plugin.

Outras dicas

Mais de dois anos depois e o bug ainda não parece ser corrigido, então aqui está o que eu encontrei:

O problema está na função 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...
}

O problema é que nas avaliações 2º e posteriores desta função, o messages[element.name].remote contém uma mensagem de erro específica (texto) e o real mensagem original é perdido para sempre quando previous.originalMessage é substituído depois disso.

Eu era capaz de contornar o problema adicionando uma verificação antes que a linha:

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

Eu não tenho certeza se este é realmente o correta solução, mas funciona -. Falhas de validação agora reaplicar a função de formatação em cada falha de validação

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top