繁体   English   中英

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

[英]JSF Validation Error from Component that is not Rendered

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

使用<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)。 输出文本使用业务区域对象上的描述字段,选择字段使用整个对象,其中SelectItem在标签中具有描述。

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

任何想法这怎么可能发生? 我可以使用相同的布尔值来设置required属性,该值确定渲染状态...因此仅在渲染状态时才需要...但是由于此问题是间歇性的...我不知道这是否真的有帮助。

我还验证了页面上的其他任何组件都不会无意中使用标签值“ Business Area”(在验证消息中使用了该值)来误导我其中哪个组件确实具有空值; 这是唯一一个带有“业务区域”标签的标签。

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

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

rendered="#{shiftDetailsController.canEditBusinessArea}"

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM