繁体   English   中英

JSF2:如何验证两个相关的复选框?

[英]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。

场景:

  1. 最初两者都未选中
  2. 用户选中复选框1。
  3. newValuetrue ,因此这是有效的,并转到UISelectBoolean和model。
  4. 用户取消选中复选框1。 Checkbox2为falsenewValuefalse ,因此引发异常。 由于验证失败,因此该false值不会传递给模型,甚至不会传递给UISelectBoolean元素。
  5. 用户选中复选框2。 True值归于模型和UISelectBoolean。
  6. 用户取消选中复选框2。 页面上Checkbox1仍未选中,但是在模型和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.

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