web-dev-qa-db-fra.com

Meilleure façon d'ajouter une option "rien sélectionné" à un selectOneMenu dans JSF

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.

42
dws

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>
96
BalusC

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>
10
rad

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"
2
A. Qaoud