在 JSF 中向 selectOneMenu 添加“未选择任何内容”选项的最佳方法

2024-02-29

我想知道允许用户在 selectOneMenu 中不选择任何内容的最佳或最简单的方法是什么。

我的示例:我有一个注册用户列表,管理员应该能够按某些条件过滤显示的用户列表。这些标准,例如用户类型(员工、客户……)可以通过 selectOneMenus 选择,如下所示:

<h:selectOneMenu value="#{myBean.selectedUsertype}" converter="#{usertypeConverter}">
<f:selectItems value={myBean.usertypes}" />
</h:selectOneMenu>

当使用转换器的 POJO 列表支持相应的 selectOneMenu 时,如何将一个项目添加到列表中以指示用户未选择任何特定项目?目前,我有一个显示标签“---”的虚拟用户类型对象,但这在我的应用程序的其他区域引起了一些问题,我认为这不是最好的解决方案。


只需将选择项值显式设置为null.

<h:selectOneMenu value="#{bean.selectedItem}">
    <f:selectItem itemValue="#{null}" itemLabel="--select--" />
    <f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>

不,一个空字符串,例如itemValue=""还不够。确实必须如此null。否则,您会遇到此问答中所述的麻烦:在 p:selectOneMenu 中使用带有 null/空值的“请选择”f:selectItem https://stackoverflow.com/questions/17052503/using-a-please-select-fselectitem-with-null-empty-value-inside-a-pselectonem/.

如果该物品恰好是required="true"并且您正在使用 JSF 2.x,那么您could add noSelectionOption="true"到选择的项目。这是only有用,如果你also set hideNoSelectionOption="true"在选择组件上。一旦最终用户选择不同的项目,它就会隐藏列表中的空选项,从而无法重新选择空选项。

<h:selectOneMenu value="#{bean.selectedItem}" hideNoSelectionOption="true">
    <f:selectItem itemValue="#{null}" itemLabel="--select--" noSelectionOption="true" />
    <f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>

另请参阅第 114 页在“SelectItem 标签”部分下:

请注意,选择的项目的值为#{null}可以用来呈现默认选择,以防 bean 属性与选择组件的关联value属性是null。如果您查阅过标签文档<f:selectItem>,那么你可能会注意到noSelectionOption属性并认为它旨在代表“无选择选项”。事实上,这不是真的。很多初学者确实是这么认为的,你可以在很多论坛、问答网站以及互联网上的劣质教程中看到这一点。尽管属性名称具有误导性,但它并不代表“无选择选项”。

更好的属性名称应该是hideWhenOtherOptionIsSelected,即使如此,它也仅在父选择组件明确具有hideNoSelectionOption="true"属性集。所以,hideWhenOtherOptionIsSelectedAndHideNoSelectionOptionIsTrue最终将是最不言自明的属性名称。不幸的是,当noSelectionOption在 JSF 1.2 中实现。不需要两个属性才能使该属性发挥作用。该属性对的主要目的是防止网站用户在组件已经具有非选择选项时能够重新选择“无选择选项”。null选定的值。例如,通过将其准备在@PostConstruct方法,或者在表单提交后重新渲染组件null value.

Copyright disclaimer: book is written by me.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JSF 中向 selectOneMenu 添加“未选择任何内容”选项的最佳方法 的相关文章