在测试OmniFaces 1.8.1中的validateOrder验证器时,似乎验证器在与Primefaces commandButton结合使用时不会应用于组件,而Primefaces commandButton基于PrimeFaces Selector(PFS)部分提交组件。下面是一个示例,它是我应用程序使用的精简但有代表性的测试用例。
<h:body>
<h:form>
<p:commandButton value="Show" action="#{testBean.save}" oncomplete="PF('testDialogJS').show()"/>
</h:form>
<p:dialog header="Test Dialog" widgetVar="testDialogJS" resizable="false" closeOnEscape="false" closable="false" modal="true" dynamic="true">
<h:form>
<p:tabView>
<p:tab title="Tab 1">
<p:panel header="Tab 1 Panel" styleClass="tab1Panel">
<p:outputLabel value="Test 1"/>
</p:panel>
</p:tab>
<p:tab title="Tab 2">
<p:panel header="Tab 2 Panel" styleClass="tab2Panel">
<h:panelGrid columns="2">
<p:outputLabel for="startDate" value="Start Date: "/>
<h:panelGroup>
<p:calendar id="startDate" value="#{testBean.startDate}" navigator="true" pattern="M/d/yyyy"
required="true" requiredMessage="Start Date is required"/>
<p:message for="startDate"/>
</h:panelGroup>
<p:outputLabel for="endDate" value="End Date: "/>
<h:panelGroup>
<p:calendar id="endDate" value="#{testBean.endDate}" navigator="true" pattern="M/d/yyyy"
required="true" requiredMessage="End Date is required"/>
<p:message for="endDate"/>
<o:validateOrder id="campaignDateRangeValidator" components="startDate endDate" message="Start Date must be before End Date"/>
<p:message for="campaignDateRangeValidator"/>
</h:panelGroup>
</h:panelGrid>
</p:panel>
</p:tab>
</p:tabView>
<p:commandButton value="Save" action="#{testBean.save}"
process="@form" update="@form"
oncomplete="if (!args.validationFailed) { PF('testDialogJS').hide(); }"/>
</h:form>
</p:dialog>
</h:body>
将开始日期设置为,例如,2014年10月1日,结束日期设置为2014年9月30日,然后单击“保存”按钮,将正确显示验证程序错误消息。但是,如果commandButton的process属性设置为@(.tab2Panel :input) @this
,则永远不会在代码中调用验证程序。我在ValidateOrder的validateValues方法中进行了细分 - 它从未被调用过。因此,允许该行动继续进行。
查看AJAX XHR,javax.faces.partial.execute被设置为传递案例中表单的组件ID,而它被设置为要在失败的情况下绑定的各个字段组件ID的显式列表(没有表格的组件ID。)
这是一个错误吗?不支持?等等?如果不支持,有关如何处理此所需用法的任何建议?谢谢!
答案 0 :(得分:1)
OmniFaces多字段验证器被设计为UI组件,因为在其他方面不可能使多字段验证在内部工作。一个<h:dataTable>
。与标准JSF验证器(例如<f:validator>
)(基本上是标签处理程序)相反,<o:validateOrder>
组件因此必须 包含在process
<p:commandButton>
属性中。 (等同地也在execute
的{{1}}属性中。)
最好的办法是明确处理整个标签,而不仅仅是标签的输入组件。 E.g。
<f:ajax>