43

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

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

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

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

4

3 回答 3

103

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

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

不,像这样的空字符串itemValue=""是不够的。它真的必须是null。否则,您会遇到本问答中所述的麻烦:在 ap:selectOneMenu 中使用带有空值/空值的“请选择” f:selectItem

如果该项目恰好是required="true"并且您使用的是 JSF 2.x,那么您可以添加noSelectionOption="true"到选择项目。这仅在您设置了选择组件时才有用。一旦最终用户选择了不同的项目,它将在列表中隐藏空选项,从而无法重新选择空选项。hideNoSelectionOption="true"

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

另请参阅“选择项标签”部分下的 JSF 权威指南的第 114 页:

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

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

版权免责声明:本书是我写的。

于 2012-07-09T14:48:57.633 回答
10

添加一个具有空值的selectItem ;

<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>
于 2012-07-06T10:28:18.813 回答
3

我们可以在 primefaces 中(当我们必须使用<p:selectOneMenu... 出于某种原因,例如使用<p:ajax..)添加以下空项:

<f:selectItem itemValue="#{null}" itemLabel="--select--"  itemDisabled="#{Mybean.value ne null}" />

注意:在这种情况下,我们不需要以下两个标签:

hideNoSelectionOption="true"

noSelectionOption="true"
于 2017-07-19T11:55:48.100 回答