来自未呈现的组件的JSF验证错误

时间:2011-12-15 14:12:14

标签: validation richfaces jsf-1.2

我有一个表单,其中有一个字段需要在编辑模式下呈现为只读值,在创建模式下需要呈现为下拉选择列表。

只读字段(在编辑模式下使用)使用<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. 值应该在backing bean中,因为显示的值来自同一个对象(shiftDetailsController.selectedBusinessArea)。输出文本使用业务区域ojbect上的description字段,select字段使用SelectItem在标签中具有描述的整个对象。
  2. field rendered as read-only with validation message appearing

    知道如何发生这种情况吗?我可以使用相同的布尔值设置所需的属性,该值确定渲染状态...这样只有在渲染时才需要...但是因为这个问题是间歇性的......我不知道这会有什么帮助

    我还验证了页面上没有其他组件无意中将标签值“Business Area”(正在验证消息中使用)误导我,哪个组件真正具有空值;这是唯一一个拥有“商业区”标签的人。

1 个答案:

答案 0 :(得分:0)

我弄清楚这个问题发生了什么。

在提交表单并收到验证错误之前。我正在做一个改变,导致控制两个组件的可见性的标志被反转。

rendered="#{shiftDetailsController.canEditBusinessArea}"

换句话说,我在表单上所做的是导致canEditBusinessArea更改值。但是,我重新渲染面板组(“baGroup”)以使UI反映更新。

因此,当我的表单被提交时,验证阶段的组件被视为必需...触发验证发生。一旦我将“baGroup”添加到正在翻转编辑业务区域标志的操作的reRender,UI就开始反映更新,并且提交的表单具有值。