web-dev-qa-db-fra.com

jQuery désactiver la validation des règles sur un seul champ

J'utilise MVC pour créer des formulaires générés au moment de l'exécution. Pour la validation, j'essaie ma main à la bibliothèque de validation jQuery qui est très pratique à utiliser. J'ai l'expression de validation de chaque champ dans l'attribut cdata de la balise

<input type="text" name="xyz" id="xyz" class="defaultTextBox"
  cdata="{validate:{required:true, decimal:true, messages:
          {required:'Please enter an decimal value', 
           decimal:'Please enter a valid decimal'}}}">

Cela fonctionne à merveille. Maintenant, une autre exigence que j'ai est que certains champs soient affichés et masqués selon la logique de la page et je dois désactiver la validation sur les champs masqués afin qu'ils n'interfèrent pas avec la soumission du formulaire. Il suffit de basculer ce qui est requis: vrai à faux et revenir à vrai devrait suffire. Seulement, je ne sais pas comment.

Quelqu'un a une expérience avec ça?

50
shake

Ajoutez simplement la règle Ignorer et définissez le sélecteur. Dans cet exemple, la validation ignorera tous les éléments qui ont le class="ignore"

$("#myform").validate({
   ignore: ".ignore"
})
82
Gabe

Si vous utilisez la validation JQuery ASP.NET MVC discrète, vous devez définir les paramètres de cette manière. Cela est dû à la façon dont Microsoft appelle réellement jQuery validate. Cela devrait être sûr de le faire dans une méthode ready.

Edit: Veuillez voir le commentaire de Cory ci-dessous avant de copier-coller ceci. C'est mon code d'origine

    $("form").data("validator").settings.ignore = ".data-val-ignore, :hidden, :disabled";

Ensuite, je demande simplement .data-val-ignore classe aux choses à ne pas valider.

Notez que vous voudrez probablement ajouter :hidden qui est en fait le comportement ignoré par défaut défini dans jquery.validate.js. J'aime ajouter :disabled aussi.

$.extend($.validator, {
defaults: {
    messages: {},
    groups: {},
    rules: {},
    errorClass: "error",
    validClass: "valid",
    errorElement: "label",
    focusInvalid: true,
    errorContainer: $([]),
    errorLabelContainer: $([]),
    onsubmit: true,
    ignore: ":hidden",              // default for ignore in jquery.validate.js
    ignoreTitle: false,
    onfocusin: function( element, event ) {
        this.lastActive = element;

Et enfin, vous voudrez peut-être le styler - particulièrement utile lors du débogage.

.data-val-ignore
{
    background: #eee;
}
37
Simon_Weaver

Suite à la réponse de Gabe, vous pouvez également définir la valeur ignorer comme valeur par défaut, vous n'avez donc pas à la définir sur chaque formulaire.

$.validator.setDefaults({ignore: ".ignore"});

Notez également que le champ ignorer est un sélecteur jQuery utilisé dans la fonction jQuery not() afin que tout sélecteur valide puisse être utilisé, pas seulement les classes simples.

Voir aussi http://docs.jquery.com/Plugins/Validation/validate#toptions pour plus de détails sur les autres valeurs par défaut qui peuvent être définies.

6
Norman H

J'ai passé un meilleur moment avec $('.multiselect').rules('remove');

dans mon cas, pour quelque raison que ce soit, l'ajout de .cancel ou .data-val-ignore à la fois à $.validator.setDefaults et à $('.multiselect') ne l'a pas corrigé.

J'ai aussi essayé

$('select[multiple][data-val]').removeAttr('data-val').removeAttr('data-val-number').addClass('data-val-ignore').validate({ ignore: "[multiple]" });
$.validator.setDefaults({ ignore: ":hidden,:disabled,.data-val-ignore" });
$('.multiselect').closest('form').data('validator').settings.ignore = ":hidden,:disabled,.data-val-ignore, .data-val-ignore *";
$('.multiselect').data('validator').settings.ignore = "[multiselect]"

chacun de ces ... et leurs combinaisons

mon jquery.validate.js était

/*! jQuery Validation Plugin - v1.11.0 - 2/4/2013
* https://github.com/jzaefferer/jquery-validation
* Copyright (c) 2013 Jörn Zaefferer; Licensed MIT */

jquery était

Bibliothèque JavaScript jQuery v1.9.1 - Date: 2013-2-4

3
Maslow