12
votes

JSF 2.0: Comment ignorer la validation des haricots JSR-303?

Comment sauter la validation des haricots JSR-303 avec JSF, lorsqu'un bouton est cliqué sur un bouton?

Un peu longue de question pour expliquer quelques approches ... Considérez une liste sous une forme: P>

<h:commandButton>
    <f:param name="VALIDATE" value="true" />
</h:commandButton>


1 commentaires

Eh bien, je n'ai pas essayé d'autres solutions de validation que JSR-303 et Facettes avec JSF. Je pense que cette question est liée à JSF et non à la faute de la JSF-303 - c'est comme si elles ont oublié de "nativement" à sauter la validation dans JSF. Il semble y avoir beaucoup de confusion autour de cela ...


4 Réponses :


9
votes

Définissez vos gestionnaires d'événement comme immédiat = true et appelez faccescontext.renderresponse () avant de les sortir.

Mise à jour :

modifications dans votre exemple formulaire: xxx

modifications dans votre code de haricot: xxx


5 commentaires

Comment faites-vous cela dans la pratique? Pouvez-vous donner un exemple?


Pour préciser: Faire cela fait que JSF Skip Phases Number 3-5 (validations de processus, Modèle de mise à jour, appelez la demande d'invocation) et va directement à la phase 6 (réponse de rendement). Ceci est correct, car le résultat est un peu comme si les validations ont échoué dans la phase 3 et JSF saute à la phase 6. Corrigez-moi si vous êtes faux. La prochaine étape de ceci serait de généraliser / composer la composition de cela afin d'appeler faccescontext.getcurrentInstance (). RenderResponse () ne serait pas nécessaire. Choisir comme réponse acceptée, merci pour la belle solution! :)


J'ai essayé ce qui précède et en général ça marche bien. Mon cas est le suivant - J'utilise un bouton de commande pour ajouter de manière dynamique un certain nombre de zones de texte à la page. Si j'utilise immédiat = "false" , la validation de la page empêchera la mise à jour et ne s'affichera pas aussi. Si j'utilise immédiat = "vrai" et modifiez les valeurs des entrées avant de faire la demande AJAX, les modifications ne seront pas soumises. Des idées Comment puis-je atteindre les deux données de lecture modifiées dans le rappel et ne pas déclencher la validation en même temps? Merci d'avance


J'ai le même problème. Je voudrais que le modèle soit mis à jour, mais saute la validation. J'ai une forme avec des onglets différents. J'ajoute des onglets lors de la sélection de différentes cases. Ajax rendre le p: tabview. Mais je ne veux pas perdre les informations déjà entrées ou modifiées dans les onglets.


Vous pouvez définir immédiatement = "true" sur INPUTTEXT et il doit modifier les valeurs avant d'invoquer toute action.



8
votes

Vous pouvez désactiver la validation des haricots avec la balise F: validatebean forte> qui a un attribut désactivé strud>.

Exemple: P>

<h:inputText value="#{bean.name}">
   <f:validateBean disabled="#{anotherBean.flag}"/>
</h:inputText>


2 commentaires

C'est une bonne information aussi. Cependant, il est toujours un peu lourd que ceci pour chaque domaine de la forme ...


Vous pouvez envelopper plusieurs composants d'entrée avec F: validatebean aussi, comme indiqué ici: Stackoverflow.com/a/17503608 / 1725096



2
votes

Nous venons de publier une solution pour ce problème. Le détail complet est ici: http://www.springfuse.com /2011/12/15/skip-jsf-validation-dependenk-on-action.html

En bref, il exploite l'attribut de liaison de la balise ValidateBean. Cela vous permet d'intercepter la méthode de validation et de décider, en fonction du bouton cliqué sur le bouton, s'il faut le laisser passer ou non.


0 commentaires

-1
votes

Situation: Dans le code de page, il existe une grosse forme avec beaucoup de champs de saisie. Il y a plusieurs boutons chacun pointant pour séparer l'action dans le haricot séparé.

une solution qui a fonctionné pour moi ... p>

  1. dans le code de page: Ajouter immédiat = "vrai" code> sur le bouton et fournir un identifiant pour les champs de saisie que vous souhaitez utiliser dans le haricot. li> ol>
    Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
    if (params != null) {
      for (String k: params.keySet())
          if (k.indexOf("someHtmlInputId") != -1)
              params.get(k); // This is Your input parameter value waiting to be processed ;)
    }
    


0 commentaires