我有一个表单,其中有一个字段需要在编辑模式下呈现为只读值,在创建模式下需要呈现为下拉选择列表。
只读字段(在编辑模式下使用)使用<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>
下面是一个屏幕截图,显示了呈现为只读的字段(处于编辑模式)。单击“保存”按钮,我收到一条验证错误消息,指出该字段是必需的。
知道如何发生这种情况吗?我可以使用相同的布尔值设置所需的属性,该值确定渲染状态...这样只有在渲染时才需要...但是因为这个问题是间歇性的......我不知道这会有什么帮助
我还验证了页面上没有其他组件无意中将标签值“Business Area”(正在验证消息中使用)误导我,哪个组件真正具有空值;这是唯一一个拥有“商业区”标签的人。
答案 0 :(得分:0)
我弄清楚这个问题发生了什么。
在提交表单并收到验证错误之前。我正在做一个改变,导致控制两个组件的可见性的标志被反转。
rendered="#{shiftDetailsController.canEditBusinessArea}"
换句话说,我在表单上所做的是导致canEditBusinessArea
更改值。但是,我不重新渲染面板组(“baGroup”)以使UI反映更新。
因此,当我的表单被提交时,验证阶段的组件被视为必需...触发验证发生。一旦我将“baGroup”添加到正在翻转编辑业务区域标志的操作的reRender,UI就开始反映更新,并且提交的表单具有值。