JSF ignorer la Nécessaire Validation immédiate de l'=true
j'ai plusieurs formulaires, où j'ai des champs obligatoires et des champs facultatifs.
à soumettre un tel formulaire j'exige la validation sur l'attribut requis à exécuter, qui fonctionne très bien.
Pour annuler un tel formulaire j'utilise l'attribut immediate="true"
sur le p:commandbutton
, ce qui rend son action se produire pendant le appliquer les valeurs de requête - Phase comme indiqué ici: comment sauter validation lorsqu'un bouton est cliqué?
Cependant, pour les grands formulaires je veux fournir à l'utilisateur avec un bouton de sauvegarde, de sorte qu'il puisse procéder plus tard.
pour simplement sauvegarder l'état actuel, je veux aussi ignorer la validation de l'attribut required -. Cependant, utiliser immediate="true"
ne fonctionne pas, car alors ma méthode de sauvegarde simple ne sauve rien, parce que le cycle de vie JSF n'atteint jamais la Phase"UpdateModelValues". (Selon http://www.javacodegeeks.com/2012/01/jsf-and-immediate-attribute-command.html )
alors, comment contourner la vérification requise mais pas sauter la moitié du cycle de vie?
5 réponses
chaque bouton crée une entrée dans la Param-List aussi longtemps qu'il est membre du formulaire. J'ai donc simplement appliqué un contrôle de la présence de cette entrée au paramètre "requis":
<h:form id="form" prependId="true">
...
<p:inputText id="someId"
required="#{param['form:save']==null}" ... />
...
<p:commandButton id="save" value="Save" />
<p:commandButton id="submit" value="Submit" />
<p:commandButton id="cancel" value="Cancel" immediate="true" />
</h:form>
quand je clique sur" soumettre "le param['form:save']
est NULL
, qui tourne alors l'expression en true
donc la validation est exécutée.
quand je clique sur "Enregistrer" le param['form:save']
est NOT NULL
(mais vide!), qui se résout à false
donc la validation est ignorée. (Ou disons que JSF pense qu'il ne s'agit pas d'un champ obligatoire en raison de l'expression étant évalué à false
)
si vous voulez sauter la validation lorsque vous cliquez sur le bouton Ajouter facilement le paramètre au bouton où vous voulez le sauter. Exemple:
<p:commandButton value="button1" action="#{bean.action()}" >
<f:param name="skipValidator" value="true"/>
</p:commandButton>
alors dans validator vous pouvez lire ce paramètre et s'il est vrai alors sauter:
@FacesValidator("com.validators.MyValidator")
public class MyValidator implements Validator{
public void validate(FacesContext ct, UIComponent co, Object obj) throws ValidatorException {
if(!continueValidation()){
return;
}
// validation process
}
protected boolean continueValidation() {
String skipValidator= FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("skipValidator");
if (skipValidator != null && skipValidator.equalsIgnoreCase("true")) {
return false;
}
return true;
}
}
c'est une excellente question et une réponse très utile. Cette approche épargne beaucoup de tracas avec immediate="true"
.
j'aimerais ajouter cette information (mais je ne suis pas encore autorisé à faire des commentaires). Vos exemples de code semblent exiger JSF 2.0 ou plus haut (me corriger). Si vous êtes comme moi damné d'utiliser JSF 1.1 / 1.2 alors considérer ces changements / additions:
<h:form id="form">
...
<p:inputText id="someId" required="#{!empty param['save']}" ... />
...
<p:commandButton id="save" value="Save" />
</h:form>
- il n'y a pas d'attribut pré-ajouté dans JSF 1.1
- donc dans le param[...] vous devez seulement spécifier le bouton id
- vous utilisez une syntaxe
="{true and ...}"
qui pourrait être une erreur (pas#
)? - comme vous pouvez le voir de votre propre histoire d'édition la logique" null ou pas null "n'est pas très intuitive :) C'est pourquoi j'ai immédiatement aimé la version
!empty ...
quand je suis tombé sur elle.
dans mon cas je n'ai pas trouvé le clientId du bouton dans les params mais j'ai trouvé ceci
param['javax.faces.source'] = buttonClientId
dans le requestmap. La valeur sera le clientId du bouton cliqué.
une alternative à ce que d'autres ont proposé est d'utiliser un personnalisé BeanValidator
qui va valider le formulaire si dire, cliqué sur le bouton avec enregistrer id. Tout autre bouton Non implicitement défini pour effectuer la validation ne validera pas mais soumettra simplement vos données disponibles. Trouver le plein bel et propre exemple ici