2014-09-30 124 views
0

我有一個p:ajax在一個窗體內觸發change事件在選擇。另外我有一個單獨的提交按鈕來提交表單。JSF Primefaces - 旁路驗證在p:ajax

該表單包含多個驗證。我想在p:ajax呼叫期間繞過所有驗證。相反,所有的驗證應該在表單提交期間進行。

這是我的形式:字段1字段2強制性。但是這些驗證應在p:ajax調用中繞過,而該調用依次根據所選的字段2值呈現字段3

我該怎麼做?

<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> 
+1

這將是很難幫助沒有看到關於您的形式的東西! – 2014-09-30 22:50:52

+0

[this](http://stackoverflow.com/questions/14335610/jsf-skip-validation-without-immediate-true)可能會幫助你。 – 2014-09-30 23:34:33

回答

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建議。

0

如果您願意使用omnifaces,則有ignoreValidationFailed標籤。

檢查在omnifaces的例子展示:

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

</o:form>