Estou trabalhando com ASP.Net MVC3
, a maneira mais fácil de usar a validação do cliente seria habilitando o jquery.validate.unobtrusive
. Tudo funciona bem, para coisas que vêm diretamente do servidor.
Mas quando tento injetar algumas novas 'entradas' com javascript, e soube que preciso chamar $.validator.unobtrusive.parse()
para religar as validações. Mesmo assim, todos aqueles campos injetados dinâmicos não estão funcionando.
Pior ainda, tento ligar manualmente usando jquery.validate
e também não está funcionando. Alguma ideia?
Respostas:
Eu criei uma extensão para a biblioteca jquery.validate.unobtrusive que resolveu esse problema para minha situação - pode ser do meu interesse.
http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/
fonte
$.validator.unobtrusive.parse()
. Além disso, parece apenas adicionar novas regras, mas não seleciona atualizações para regras existentes.Tentei a abordagem de Xhalent, mas infelizmente não funcionou para mim. A abordagem de Robin funcionou e não funcionou. Funcionou muito bem para elementos adicionados dinamicamente, mas se você tentasse usar JQuery para remover todos os atributos de validação e spans do DOM, a biblioteca de validação ainda tentaria validá-los.
No entanto, se você remover os dados "unobtrusiveValidation" do formulário além de "validationData", funcionará perfeitamente para adicionar e remover dinamicamente os elementos que você deseja validar ou não validar.
fonte
validator
não está definido? Eu tenho a validação e a validação.unobtrusive referenciadas. A validação funciona até que eu chame esses códigos$('#form').validate({ignore: ""})
Na verdade, gosto muito da simplicidade da solução @viggity e @Robins, então a transformei em um pequeno plugin rápido:
Exemplo de uso:
fonte
Estou tendo o mesmo problema. Descobri que não é possível chamar $ .validator.unobtrusive.parse () no mesmo formulário duas vezes. Ao carregar o formulário inicialmente do servidor, o formulário é analisado automaticamente pela biblioteca não obstrutiva. Quando você adiciona um elemento de entrada dinamicamente ao formulário e chama $ .validator.unobtrusive.parse () novamente, não funcionará. O mesmo vale para parseElement ().
O lib discreto chama o método validate do plugin jquery validate para definir todas as regras e mensagens. O problema é que, quando chamado novamente, o plugin não atualiza o novo conjunto de regras fornecido.
Encontrei uma solução grosseira: antes de chamar o método de análise na biblioteca não obstrutiva, jogo fora o validador de formulário:
Agora, quando o método validate é chamado pela biblioteca discreta, todas as regras e mensagens são recriadas, incluindo as entradas adicionadas dinamicamente.
Espero que isto ajude
fonte
Estou usando MVC 4 e JQuery 1.8, parece que o código a seguir é necessário para permitir que o Jquery valide o conteúdo injetado dinamicamente via Ajax ou Jquery no DOM.
Fiz uma função modular que aceita o objeto Jquery do elemento recém-adicionado. Se você clonou uma nova tabela com id
tblContacts
usando Jquery ao clicar em um botão, inclua a função abaixo em seu arquivo jse chamá-lo assim:
fonte
Por que não usar a função de regras diretamente do documento de validação do jquery. Como isso:
fonte
Pegando a solução de Xhalent marcada como resposta acima, eu a expandi um pouco.
Basicamente, ele ainda funciona da mesma forma que a solução de Xhalent acima, mas adicionei a capacidade de remover regras para os elementos removidos do dom. Então, quando você remover elementos do Dom e quiser que essas regras de validação também sejam removidas, chame:
fonte
Encontrei o script de código de @Xhalent no meu código e ia excluí-lo porque não o estava usando, o que me levou a esta questão do SO.
Este código é bastante limpo e simples:
Então, para chamar esta extensão jQuery, basta usar um seletor para pegar seu formulário:
Viola!
fonte
Tentei a resposta de Viggity e a princípio tudo pareceu funcionar. Mas depois de um tempo, percebi que a validação fica dolorosamente lenta quanto mais itens eu adicionei dinamicamente. O motivo é que sua solução não desvincula os manipuladores de eventos, mas adiciona novos a cada vez. Portanto, se você adicionar 5 itens, a validação será executada 6 vezes em vez de apenas uma vez. Para corrigir isso, você deve desvincular os eventos adicionalmente às chamadas removeData.
fonte
No caso de conteúdos dinâmicos, você precisa atualizar as validações discretas conforme abaixo e verificar se
Form
são válidas durante o envio.fonte
Tenho mexido nisso por um tempo, descartando soluções e tentando novamente mais tarde (quando eu tivesse algum tempo livre, acredite ou não).
Não tenho certeza se esse comportamento teria mudado nas versões mais recentes do jquery (estamos usando 1.7.2) desde que este tópico foi criado ou comentado pela última vez, mas descobri que
.parseElement(inputElement)
funciona bem quando tento adicionar elementos criados dinamicamente a um formulário que já possui um validador carregado. Isso já foi sugerido por @jamesfm (15 de fevereiro '11) em um dos comentários acima, mas eu esqueci nas primeiras vezes que estava trabalhando nisso. Portanto, estou adicionando como uma resposta separada para torná-la mais óbvia e porque acho que é uma boa solução e não requer tanta sobrecarga. Pode não ser relevante para todas as questões levantadas nas respostas subsequentes, mas acho que seria uma solução para a questão original. Veja como fiz o meu funcionar:fonte
Em primeiro lugar, acho que a chamada deve ser para .validator, não validar então você precisa passar o id do formulário
fonte
Se você precisar adicionar e remover coisas com a possibilidade de que alguns erros já sejam exibidos, é o que eu vim. É baseado principalmente em diferentes ideias nesta página de perguntas. Eu uso o embutido em
destroy()
vez de apenas remover o atributo de dados para validar JQuery.Você o chama antes de modificar dinamicamente as entradas no formulário. Em seguida, você reinicializa a validação depois.
Nota: Se algumas ou todas as entradas foram validadas e contêm erros, esses erros serão zerados ... mas eles voltarão corretamente na próxima validação.
fonte