JSF Primefaces - 在p:ajax中绕过验证

时间:2014-09-30 22:38:12

标签: jsf-2 primefaces

我在表单中有一个p:ajax,它会在select中的change事件中触发。我还有一个单独的提交按钮来提交表格。

表单包含多个验证。我希望在p:ajax通话期间绕过所有验证。相反,所有验证都应在表单提交期间进行。

这是我的表单: Field1 Field2 必填。但是,p:ajax调用期间应绕过这些验证,然后根据所选的 Field2 值呈现 Field3

我该怎么做?

<h:body>

    <h:form id="formId">

        <p:outputPanel autoUpdate="true">

            <p:message for="field1Id field2Id" />

            <p:panel id="panelId">
                <p:panelGrid>

                    <p:row>
                        <p:column>
                            <h:outputText value="Field1:" />
                        </p:column>
                        <p:column>
                            <p:inputText
                                id="field1Id"
                                required="true"
                                requiredMessage="Field1 is Required!"
                                value="#{testBean.field1}"
                                size="5"
                                maxlength="30" />
                        </p:column>
                    </p:row>

                    <p:row>
                        <p:column>
                            <h:outputText value="Field2:" />
                        </p:column>
                        <p:column>
                            <p:selectOneMenu
                                id="field2Id"
                                value="#{testBean.field2}"
                                required="true"
                                requiredMessage="Field2 is Required!">
                                <f:selectItems
                                    value="#{testBean.fields}"
                                    var="var1"
                                    itemDescription="#{var1.description}"
                                    itemLabel="#{var1.description}"
                                    itemValue="#{var1.id}" />

                                <p:ajax
                                    process="@form"
                                    event="change" />

                            </p:selectOneMenu>
                        </p:column>
                    </p:row>

                    <p:row rendered="#{testBean.field2 > 0}">
                        <p:column>
                            <h:outputText value="Field3:" />
                        </p:column>
                        <p:column>
                            <p:inputText
                                value="#{testBean.field3}"
                                size="5"
                                maxlength="10" />
                        </p:column>
                    </p:row>

                </p:panelGrid>
                <p:commandButton
                    value="Save"
                    action="#{testBean.saveForm()}"
                    process="@form" />
            </p:panel>
        </p:outputPanel>

    </h:form>

</h:body>

2 个答案:

答案 0 :(得分:3)

您可以通过以下代码实现。我的代码只是在按钮上添加了绑定属性(binding="{save}"),并将required="true"更改为required="#{not empty param[save.clientId]}"

<h:body>
    <h:form id="formId">
        <p:outputPanel autoUpdate="true">
            <p:message for="field1Id field2Id" />
            <p:panel id="panelId">
                <p:panelGrid>
                    <p:row>
                        <p:column>
                            <h:outputText value="Field1:" />
                        </p:column>
                        <p:column>
                            <p:inputText
                                id="field1Id"
                                required="#{not empty param[save.clientId]}"
                                requiredMessage="Field1 is Required!"
                                value="#{testBean.field1}"
                                size="5"
                                maxlength="30" />
                        </p:column>
                    </p:row>
                    <p:row>
                        <p:column>
                            <h:outputText value="Field2:" />
                        </p:column>
                        <p:column>
                            <p:selectOneMenu
                                id="field2Id"
                                value="#{testBean.field2}"
                                required="#{not empty param[save.clientId]}"
                                requiredMessage="Field2 is Required!">
                                <f:selectItems
                                    value="#{testBean.fields}"
                                    var="var1"
                                    itemDescription="#{var1.description}"
                                    itemLabel="#{var1.description}"
                                    itemValue="#{var1.id}" />
                                <p:ajax
                                    process="@form"
                                    event="change" />

                            </p:selectOneMenu>
                        </p:column>
                    </p:row>
                    <p:row rendered="#{testBean.field2 > 0}">
                        <p:column>
                            <h:outputText value="Field3:" />
                        </p:column>
                        <p:column>
                            <p:inputText
                                value="#{testBean.field3}"
                                size="5"
                                maxlength="10" />
                        </p:column>
                    </p:row>
                </p:panelGrid>
                <p:commandButton
                    value="Save"
                    binding="{save}"
                    action="#{testBean.saveForm()}"
                    process="@form" />
            </p:panel>
        </p:outputPanel>
    </h:form>
</h:body>

这种方法是由link提出的。

答案 1 :(得分:1)

如果您愿意使用omnifaces,则会有一个ignoreValidationFailed代码。

查看omnifaces showcase上的示例:

<o:form>
  ...
  <h:commandButton value="save valid data" action="#{bean.saveValidData}">
    <o:ignoreValidationFailed />
    <f:ajax execute="@form" />
  </h:commandButton>

</o:form>