2011-12-15 66 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就开始反映更新,并且提交的表单具有该值。