2011-12-15 46 views
0

我有一個窗體,需要在編輯模式下呈現爲只讀值,並且在創建模式下作爲下拉選擇列表呈現。來自未呈現組件的JSF驗證錯誤

只讀字段(用於編輯模式)使用<h:outputText>呈現爲純文本。在創建模式下,該字段呈現爲<h:selectOneListbox>,其中必須具有「true」屬性。

它似乎工作正如我所期望的大部分時間,但偶爾我會在編輯模式下(選擇列表框未呈現)時出現驗證錯誤。

下面是代碼片段,這兩個字段都使用相同的布爾值設置了呈現的屬性(只有一個字段否定要切換的布爾值)。

<h:outputLabel id="lblBusinessArea" value="Business Area:" /> 
<h:panelGroup id="baGroup"> 
    <h:selectOneListbox id="businessAreaList" size="1" 
      rendered="#{shiftDetailsController.canEditBusinessArea}" 
      converter="businessAreaConverter" 
      value="#{shiftDetailsController.selectedBusinessArea}" 
      label="Business Area" 
      required="true"> 
     <f:selectItems id="businessAreaListItems" value="#{shiftDetailsController.businessAreas}" /> 
     <a4j:support id="businessAreaA4j" event="onchange" 
      ajaxSingle="true" reRender="deploymentGroupList, positionPayGroupList, sapPremCodeList" /> 
    </h:selectOneListbox> 
    <h:outputText id="businessAreaRO" 
     rendered="#{!shiftDetailsController.canEditBusinessArea}" 
     value="#{shiftDetailsController.selectedBusinessArea.busAreaDesc}" /> 
</h:panelGroup> 

下面是屏幕截圖,顯示呈現爲只讀狀態的字段(處於編輯模式)。點擊「保存」按鈕,我收到驗證錯誤消息,說明該字段是必需的。

  1. 由於顯示的值來自同一對象(shiftDetailsController.selectedBusinessArea),因此該值應該位於backing bean中。輸出文本使用業務區域ojbect上的description字段,select字段使用SelectItem在標籤中具有描述的整個對象。

field rendered as read-only with validation message appearing

任何想法如何這可能是發生?我可以使用確定呈現狀態的相同布爾值來設置必需的屬性...因此它只在呈現時才需要......但是由於此問題是間歇性的......我不知道這真的會有幫助。

我還驗證了頁面上的其他組件無意中有一個標籤值「Business Area」(正在驗證消息中使用)誤導我確定哪個組件真正具有空值;這是唯一一個標有「商業區」的商標。

回答

0

我想通了這個問題發生了什麼。

在提交表單並收到驗證錯誤之前。我正在做出改變,導致控制兩個組件的可見性的旗幟被顛倒過來。

rendered="#{shiftDetailsController.canEditBusinessArea}" 

換句話說,我在做什麼的形式是造成canEditBusinessArea更改值。但是,我是而不是重新渲染面板組(「baGroup」)以使UI反映更新。

因此,當我的表單被提交時,驗證階段的組件被認爲是需要的...觸發驗證發生。只要我將「baGroup」添加到正在翻轉編輯業務區域標誌的操作的reRender中,UI就開始反映更新,並且提交的表單具有該值。