h:selectBooleanCheckbox没有设置正确的值

时间:2014-04-30 12:19:54

标签: jsf-2 richfaces myfaces

版本:

Aapche MyFaces 2.1.14 RichFaces 4.3.5

问题:

我面临着JSF2.1

的非常奇怪的问题

如末尾的代码片段所示,基于布尔变量#{bean.disabled}.禁用布尔复选框 问题如下:

1)首先#{bean.disabled}评估为false,因此启用了复选框。 用户单击复选框并提交表单(此处未显示表单)

2)操作方法设置disabled = truerequired= true并再次呈现相同的页面

3)在此阶段,UI已单击并禁用复选框。在这个阶段,形式是 再次提交,bean.setRequired方法调用setter值为FALSE,而应将其设置为TRUE

4)当我创建disabled="#{false}"时,此问题消失,并且使用setter值调用bean.setRequired方法为TRUE

所以问题是为什么即使UI在点击条件中显示复选框(也就是它的值为TRUE),也会观察到步骤3中的行为,我还打印了 bean.required value并且仅评估TRUE

代码:

        <h:panelGroup>

            <h:selectBooleanCheckbox id="invite" disabled="#{bean.disabled}" value="#{bean.required}" />

                <h:outputText value="Do Update"/>
         </h:panelGroup>    

1 个答案:

答案 0 :(得分:3)

确保绑定到#{bean.disabled}的支持属性是布尔值,而不是设置值"TRUE""FALSE"的字符串。

此外,您预期在步骤3中描述的行为。禁用该复选框后,提交的值将始终为false ,因为浏览器通常会在表单提交期间忽略已禁用的字段。要确保获得正确的值,请在复选框旁边保留一个隐藏字段,同时保持它们两者同步并使用隐藏字段的值来测试复选框是选中还是取消选中。如下所示:

<h:selectBooleanCheckbox id="invite" disabled="#{bean.disabled}" value="#{bean.required}" />
<h:inputHidden id="inviteHidden" value="#{bean.requiredHidden}" />

// While setting values, set values for both fields inside the action method

bean.setRequired(true); // ..or false
bean.setRequiredHidden(true); // ..or false

// And to test whether checkbox is checked, do...
if(bean.isRequiredHidden()) {
   ....
}

与您的问题无关,如果您使用<c:set/>进行条件渲染,请考虑使用<a4j:outputPanel rendered = "#{someCondition}"/>而在表单上提交更新(如果是AJAX提交。