Je me demandais quelle serait la meilleure façon ou la plus simple de permettre à un utilisateur de ne rien sélectionner dans un selectOneMenu.
Mon exemple: j'ai une liste d'utilisateurs enregistrés et l'administrateur devrait pouvoir filtrer la liste des utilisateurs affichés selon certains critères. Ces critères, comme le type d'utilisateur (employé, client, ...) peuvent être choisis par selectOneMenus, comme ceci:
<h:selectOneMenu value="#{myBean.selectedUsertype}" converter="#{usertypeConverter}">
<f:selectItems value={myBean.usertypes}" />
</h:selectOneMenu>
Lorsque le selectOneMenu correspondant est soutenu par une liste de POJO utilisant un convertisseur, comment puis-je ajouter un élément à la liste indiquant que l'utilisateur n'a choisi aucun élément spécifique? Actuellement, j'ai un objet de type utilisateur factice affichant l'étiquette "---", mais cela pose plusieurs problèmes dans d'autres domaines de mon application et je ne pense pas que ce soit la meilleure solution.
Définissez simplement explicitement la valeur de l'élément sélectionné sur null
.
<h:selectOneMenu value="#{bean.selectedItem}">
<f:selectItem itemValue="#{null}" itemLabel="--select--" />
<f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>
Non, une chaîne vide comme itemValue=""
c'est insuffisant. Il faut vraiment que ce soit null
. Sinon, vous rencontrez des problèmes comme décrit dans cette Q&R: en utilisant un "Veuillez sélectionner" f: selectItem avec une valeur nulle/vide dans un p: selectOneMen .
Si l'article se trouve être required="true"
et vous utilisez JSF 2.x, vous pouvez ajouter noSelectionOption="true"
à l'élément sélectionné. Ceci n'est utile que si vous également définissez hideNoSelectionOption="true"
sur le composant de sélection. Il masquera ensuite l'option vide dans la liste une fois que l'utilisateur final aura sélectionné un élément différent, rendant ainsi impossible de resélectionner l'option vide.
<h:selectOneMenu value="#{bean.selectedItem}" hideNoSelectionOption="true">
<f:selectItem itemValue="#{null}" itemLabel="--select--" noSelectionOption="true" />
<f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>
Ajoutez un seul selectItem avec une valeur nulle;
<h:selectOneMenu value="#{bean.question}" required="true" requiredMessage="Please select a question">
<f:selectItem itemValue="#{null}" itemLabel="Select" />
<f:selectItems value="#{bean.questions}" />
</h:selectOneMenu>
Nous pouvons dans des primefaces (quand nous devons utiliser <p:selectOneMenu
... pour une raison comme l'utilisation de <p:ajax
..) ajoutez l'élément vide suivant:
<f:selectItem itemValue="#{null}" itemLabel="--select--" itemDisabled="#{Mybean.value ne null}" />
Remarque: Dans ce cas, nous n'avons pas besoin des deux balises suivantes:
hideNoSelectionOption="true"
et
noSelectionOption="true"