只需将选择项值显式设置为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 属性为 ,则可以使用值为 的选择项来呈现默认选择。如果您查阅过 的标签文档,那么您可能已经注意到该属性并认为它旨在表示“无选择选项”。事实上,这不是真的。许多初学者确实是这样认为的,正如您在互联网上的许多论坛、问答网站和劣质教程中看到的那样。尽管具有误导性的属性名称,但它并不代表“无选择选项”。value
null
<f:selectItem>
noSelectionOption
更好的属性名称应该是hideWhenOtherOptionIsSelected
,即使这样,它也仅在父选择组件具有明确的hideNoSelectionOption="true"
属性集时才有效。因此,hideWhenOtherOptionIsSelectedAndHideNoSelectionOptionIsTrue
最终将是最不言自明的属性名称。noSelectionOption
不幸的是,当在 JSF 1.2 中实现时,这并没有得到很好的考虑。不需要两个属性才能使该属性起作用。该属性对的主要目的是防止网站用户在组件已经选择了非null
值时能够重新选择“无选择选项”。例如,通过在方法中准备它,或者通过在表单提交后使用非值@PostConstruct
重新渲染组件。null
版权免责声明:本书是我写的。