这是我的配置:

  • PrimeFaces:4.0.4(精英)
  • OmniFaces:1.6.3
  • JSF:MyFaces 2.0.2
  • 服务器:WebSphere 8.5.0.2

  • 一些代码(为了更清楚,我只发布了相关部分):
    <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}" ... />
    

    10-07 22:05