2014-09-30 41 views
1

在OmniFaces 1.8.1中測試validateOrder驗證程序時,驗證程序似乎不適用於與Primefaces命令按鈕配合使用,該命令按鈕部分提交基於PrimeFaces選擇器(PFS)。下面是一個示例,這是我的應用程序使用情況的簡明但具有代表性的測試用例。o:在進程屬性中使用PFS時不應用validateOrder

<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的進程屬性設置爲@(.tab2Panel :input) @this,則不會在代碼中調用驗證程序。我在ValidateOrder的validateValues方法中突出了它 - 它從來沒有被調用過。因此,該行爲可以繼續進行。

看着AJAX XHR,javax.faces.partial.execute被設置爲通過的情況下表單的組件ID,而它被設置爲在失敗情況下綁定的單個字段組件ID的顯式列表(沒有表格的組件ID)。

這是一個錯誤?不支持?等等?如果不支持,有關如何處理這種期望的用法的任何建議?謝謝!

回答

1

OmniFaces多字段驗證器被設計爲UI組件,因爲它包含其他內容,否則無法獲得多字段驗證以便在其內部工作。一個<h:dataTable>。上違背標準JSF驗證諸如<f:validator>,它們基本上taghandlers,所述<o:validateOrder>組件必須因此可以在<p:commandButton>(和等效也execute屬性的<f:ajax>)的process屬性覆蓋。

最好的辦法是明確地處理整個選項卡,而不是僅處理選項卡的輸入組件。例如。

<p:tabView id="tabs"> 
    <p:tab id="tab2"> 
     ... 
    </p:tab> 
</p:tabView> 
<p:commandButton ... process="@this tabs:tab2" /> 
+0

Ah k,由於驗證器是非PrimeFaces UI組件,因此PF不一定知道在生成的XHR的執行組件列表中包含驗證器組件?這一切都有道理。並處理選項卡的作品。我現在必須回到真正的應用程序,看看是否有原因,我不是首先處理選項卡。 :) 謝謝! – 2014-09-30 20:28:21

+0

不客氣。不,你的PFS只在具有'tab2Panel'類的HTML元素中選擇所有具有'id'的HTML''元素。 ''不會爲HTML生成任何東西,所以也沒有什麼jQuery可以選擇並將其轉換爲''process'的id。如果您真的想知道PFS的工作方式,請參考以下問答:http://stackoverflow.com/q/20080861除了處理整個選項卡,您還可以明確地將''的'id'添加到'process'屬性。 – BalusC 2014-09-30 20:32:42

+0

Doh。沒關係。是的,我忘了驗證器不會生成任何客戶端。我知道最終效果和中間的一些部分。大腦與鍵盤上的手指斷開了一會兒。感謝您的鏈接了。 – 2014-09-30 20:37:20

相關問題