0

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

只读字段(在编辑模式下使用)使用<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. 该值应该存在于支持 bean 中,因为显示的值来自同一个对象 (shiftDetailsController.selectedBusinessArea)。输出文本使用业务区域 ojbect 上的描述字段,选择字段使用 SelectItem 在标签中有描述的整个对象。

字段呈现为只读,并出现验证消息

知道这是怎么发生的吗?我可以使用确定渲染状态的相同布尔值来设置所需的属性...这样只有在渲染时才需要它...但是由于这个问题是间歇性的...我不知道这是否真的有帮助.

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

4

1 回答 1

0

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

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

rendered="#{shiftDetailsController.canEditBusinessArea}"

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

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

于 2011-12-16T21:29:47.457 回答