[英]JSF2: How to validate two dependent checkboxes?
我在JSF2中有一个带有2个复选框( <h:selectBooleanCheckbox>
)的<h:selectBooleanCheckbox>
。 至少应检查其中之一。 两者都检查也可以,但是如果都没有检查,则应该有错误。
此验证也应在ajax上起作用,即,当用户选中/取消选中时,错误消息应该消失/出现。
所以我将两个复选框都绑定到UISelectBoolean
元素,并为每个元素添加了验证器。 在验证器中,我检查第二个复选框的值,如果它为false,并且当前复选框也设置为false,则会生成错误消息。 像:
if (newValue == false && secondCheckbox.getValue() == false) {
throw new ValidationException();
}
问题是,当用户取消选中页面上的复选框,而另一个也未被选中时,该假值不会传递给模型,也不会传递给UISelectBoolean。
场景:
newValue
为true
,因此这是有效的,并转到UISelectBoolean和model。 false
, newValue
为false
,因此引发异常。 由于验证失败,因此该false
值不会传递给模型,甚至不会传递给UISelectBoolean元素。 True
值归于模型和UISelectBoolean。 true
。 因此验证通过,并且没有错误消息。 在页面上,两个复选框均未选中,但在模型中,checkbox1仍为true
。 如何解决这样的问题?
考虑<h:selectManyCheckbox required="true">
。 这是一个启动示例:
<h:form>
<h:selectManyCheckbox id="options" value="#{bean.checked}" required="true">
<f:selectItems value="#{bean.options}" />
<f:ajax render="optionsMessage" />
</h:selectManyCheckbox>
<h:message id="optionsMessage" for="options" />
<h:commandButton value="Submit" action="#{bean.submit}">
<f:ajax execute="@form" render="@form" />
</h:commandButton>
<h:messages globalOnly="true" />
</h:form>
用
@ManagedBean
@RequestScoped
public class Bean {
private List<String> checked;
private List<String> options = Arrays.asList("first", "second");
public void submit() {
System.out.println("Checked: " + checked);
}
// ...
}
f:ajax
在这里工作正常。 可能是您使用了event="click"
而不是(默认) event="valueChange"
,这将导致在渲染后不会保留选中标记。 即,在视觉上设置对号之前,即称为click
。 渲染将阻止在视觉上设置检查标记。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.