Jsf 2 h:selectBooleanCheckbox未设置正确的值

Jsf 2 h:selectBooleanCheckbox未设置正确的值,jsf-2,richfaces,myfaces,Jsf 2,Richfaces,Myfaces,版本: <h:panelGroup> <h:selectBooleanCheckbox id="invite" disabled="#{bean.disabled}" value="#{bean.required}" /> <h:outputText value="Do Update"/> </h:panelGroup> Aapche MyFac

版本:

        <h:panelGroup>

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

                <h:outputText value="Do Update"/>
         </h:panelGroup>    
Aapche MyFaces 2.1.14 RichFaces 4.3.5

问题:

        <h:panelGroup>

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

                <h:outputText value="Do Update"/>
         </h:panelGroup>    
对于JSF2.1,我面临着非常奇怪的问题

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

1) 第一个
#{bean.disabled}
的计算结果为false,因此复选框被启用。 用户单击复选框并提交表单(此处未显示表单)

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

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

4) 当我禁用
disabled=“#{false}”
时,这个问题消失了,调用bean.setRequired方法时,setter值为
TRUE

所以问题是,为什么第3步中的行为会被观察到,即使UI在单击的情况下显示复选框(这意味着它的值为
TRUE
),我也打印了 bean.required值,并且仅计算为
TRUE

代码:

        <h:panelGroup>

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

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

确保绑定到
{bean.disabled}
的backing属性是布尔值,而不是为其设置值
“TRUE”
“FALSE”
的字符串

此外,您在步骤3中描述的行为也是预期的。当复选框被禁用时,提交的值将始终为false,因为浏览器通常在表单提交过程中忽略禁用的字段。为确保获得正确的值,请在复选框旁边维护一个隐藏字段,使两者保持同步,并使用t值而是隐藏字段以测试复选框是否选中。如下所示:

<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()) {
   ....
}

//在设置值时,为action方法内的两个字段设置值
setRequired(true);/…或false
setRequiredHidden(true);/…或false
//要测试复选框是否选中,请执行。。。
if(bean.isRequiredHidden()){
....
}

与您的问题无关,如果您使用“代码> <代码>进行条件呈现,请考虑使用<代码> <代码>,并在您的表单提交更新(如果是Ajax提交。

< P>),确保绑定到“代码”> {{Bean。禁用} /代码>的后备属性是布尔值,而不是值>代码>“true”和<代码>“false”的字符串。正在设置

此外,您在步骤3中描述的行为也是预期的。当复选框被禁用时,提交的值将始终为false,因为浏览器通常在表单提交过程中忽略禁用的字段。为确保获得正确的值,请在复选框旁边维护一个隐藏字段,使两者保持同步,并使用t值而是隐藏字段以测试复选框是否选中。如下所示:

<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()) {
   ....
}

//在设置值时,为action方法内的两个字段设置值
setRequired(true);/…或false
setRequiredHidden(true);/…或false
//要测试复选框是否选中,请执行。。。
if(bean.isRequiredHidden()){
....
}

与您的问题无关,如果您使用“代码> <代码>进行条件呈现,请考虑使用<代码> <代码>,并在您的表单提交更新(如果是Ajax提交。

< P>),确保绑定到“代码”> {{Bean。禁用} /代码>的后备属性是布尔值,而不是值>代码>“true”和<代码>“false”的字符串。正在设置

此外,您在步骤3中描述的行为也是预期的。当复选框被禁用时,提交的值将始终为false,因为浏览器通常在表单提交过程中忽略禁用的字段。为确保获得正确的值,请在复选框旁边维护一个隐藏字段,使两者保持同步,并使用t值而是隐藏字段以测试复选框是否选中。如下所示:

<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()) {
   ....
}

//在设置值时,为action方法内的两个字段设置值
setRequired(true);/…或false
setRequiredHidden(true);/…或false
//要测试复选框是否选中,请执行。。。
if(bean.isRequiredHidden()){
....
}

与您的问题无关,如果您使用“代码> <代码>进行条件呈现,请考虑使用<代码> <代码>,并在您的表单提交更新(如果是Ajax提交。

< P>),确保绑定到“代码”> {{Bean。禁用} /代码>的后备属性是布尔值,而不是值>代码>“true”和<代码>“false”的字符串。正在设置

此外,您在步骤3中描述的行为也是预期的。当复选框被禁用时,提交的值将始终为false,因为浏览器通常在表单提交过程中忽略禁用的字段。为确保获得正确的值,请在复选框旁边维护一个隐藏字段,使两者保持同步,并使用t值而是隐藏字段以测试复选框是否选中。如下所示:

<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()) {
   ....
}

//在设置值时,为action方法内的两个字段设置值
setRequired(true);/…或false
setRequiredHidden(true);/…或false
//要测试复选框是否选中,请执行。。。
if(bean.isRequiredHidden()){
....
}

与您的问题无关,如果您使用“代码> <代码>进行条件呈现,请考虑使用<代码> <代码>,并在表单上提交更新(如果是AJAX提交。

问题的
c:if
部分是否与问题相关?@Xtreme Biker:它实际上没有任何相关性,然后将其从问题中删除。问题应该包含显示问题的最小代码部分