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:它实际上没有任何相关性,然后将其从问题中删除。问题应该包含显示问题的最小代码部分