我在JSF2中有一个带有2个复选框(<h:selectBooleanCheckbox>
)的表单。至少应检查其中一个。两个检查都没问题,但是如果没有选中,则应该有错误。
此验证也适用于ajax,即当用户检查/取消检查时,错误消息应该消失/出现。
因此,我将两个复选框绑定到UISelectBoolean
个元素,并为每个元素添加了验证器。在验证器中,我检查第二个复选框的值,如果为false,并且当前复选框也设置为false,则生成errormessage。 Smth喜欢:
if (newValue == false && secondCheckbox.getValue() == false) {
throw new ValidationException();
}
问题是当用户取消选中页面上的复选框,而另一个也未选中时,此错误值不会转到模型,也不转到UISelectBoolean。
情景:
newValue
是true
,所以这是有效的,转到UISelectBoolean和model。false
,newValue
为false
,因此会引发异常。
由于验证失败,此false
值不会转到模型,也不会转到UISelectBoolean元素。True
值转到模型和UISelectBoolean。true
。因此验证通过并且没有错误消息。在页面上,两个复选框都未选中,但在模型中复选框1仍为true
。如何解决这样的问题?
答案 0 :(得分:1)
考虑<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
。渲染将阻止可视化设置的复选标记。