我在JSF2中有一个带有两个复选框(<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 UISelectBoolean检查checkbox2。UISelectBoolean.True
值传递给模型,并取消检查checkbox2。页面上仍未选中Checkbox1,但在模型和UISelectBoolean中仍然存在true
。因此,验证通过,并且没有错误消息。在页面上,这两个复选框都未选中,但在模型中,true
.仍然是checkbox1。
如何解决这样的问题?
发布于 2010-12-08 09:04:33
考虑一下<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
也就是在目视设置检查点之前调用的。呈现将阻止正在视觉上设置的复选标记。
https://stackoverflow.com/questions/4387463
复制