这是我的配置:
一些代码(为了更清楚,我只发布了相关部分):
<p:selectOneMenu value="#{viewModel.selectedContact}" required="true" converter="omnifaces.SelectItemsConverter">
<p:ajax event="change" listener="#{viewModel.updateContact}" update="area"/>
<f:selectItem itemValue="#{null}" itemLabel="#{msg.no_contact}" noSelectionOption="true" />
<f:selectItems value="#{viewModel.contacts}"/>
</p:selectOneMenu>
所以在这里,我们有一个简单的
p:selectOneMenu
,其中包含一个 Contact
对象列表以及一个“无联系”选项。如果我想提交表单,则此字段是必需的。当列表中的联系人被选中时,将调用
updateContact
方法。此方法将生成将显示在由 AJAX 调用更新的页面的 area
部分中的数据。如果我选择“No Contact”选项,则会触发验证错误,因为该字段是必需的,因此不会调用
updateContact
方法。我希望调用该方法,因为我需要重置一些数据然后隐藏页面的 area
部分。我曾尝试使用
process="@this"
、 immediate="true"
,但它不起作用。使用 immediate="true"
,选定的 Contact
不会传递给 updateContact
方法。那么,在选择空值时绕过此字段验证的最佳方法是什么?
最佳答案
让 required
属性检查命令按钮是否被调用。您可以通过请求参数映射中按钮的客户端 ID 的存在来检查这一点。
<p:selectOneMenu ... required="#{not empty param[save.clientId]}" />
...
<p:commandButton binding="#{save}" ... />
(注意:代码是原样的,您不需要为此使用 bean 属性)
如果没有调用命令按钮(而是调用了 ajax 更改监听器),那么
required
属性将评估 false
并且一切都会按照您的意图进行。更新 :根据评论,您打算在渲染响应期间始终使它们看起来像必需的。因此,只需添加该检查:
<p:selectOneMenu ... required="#{not empty param[save.clientId] or facesContext.currentPhaseId.ordinal eq 6}" />
...
<p:commandButton binding="#{save}" ... />