o:在进程属性中使用PFS时未应用validateOrder

时间:2014-09-30 20:09:52

标签: validation jsf primefaces omnifaces

在测试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。)

这是一个错误吗?不支持?等等?如果不支持,有关如何处理此所需用法的任何建议?谢谢!

1 个答案:

答案 0 :(得分:1)

OmniFaces多字段验证器被设计为UI组件,因为在其他方面不可能使多字段验证在内部工作。一个<h:dataTable>。与标准JSF验证器(例如<f:validator>)(基本上是标签处理程序)相反,<o:validateOrder>组件因此必须 包含在process <p:commandButton>属性中。 (等同地也在execute的{​​{1}}属性中。)

最好的办法是明确处理整个标签,而不仅仅是标签的输入组件。 E.g。

<f:ajax>