JSF2:如何验证两个相关复选框?
我在JSF2中有一个表单,有两个复选框(JSF2:如何验证两个相关复选框?,jsf,validation,jsf-2,Jsf,Validation,Jsf 2,我在JSF2中有一个表单,有两个复选框()。至少应检查其中一个。两个都选中也可以,但如果没有选中,则应该有错误 这种验证应该也适用于ajax,即当用户选中/取消选中时,错误消息应该消失/出现 因此,我将这两个复选框绑定到UISelectBoolean元素,并为每个元素添加了验证器。在验证器中,我检查第二个复选框的值,若它为false,并且当前复选框也设置为false,则生成errormessage。Smth类似: if (newValue == false && secondCh
)。至少应检查其中一个。两个都选中也可以,但如果没有选中,则应该有错误
这种验证应该也适用于ajax,即当用户选中/取消选中时,错误消息应该消失/出现
因此,我将这两个复选框绑定到UISelectBoolean
元素,并为每个元素添加了验证器。在验证器中,我检查第二个复选框的值,若它为false,并且当前复选框也设置为false,则生成errormessage。Smth类似:
if (newValue == false && secondCheckbox.getValue() == false) {
throw new ValidationException();
}
问题是,当用户取消选中页面上的复选框,而另一个复选框也未选中时,此假值不会进入模型,也不会进入UISelectBoolean事件
情景:
newValue
为true
,因此这是有效的,转到UISelectBoolean and modelfalse
,newValue
为false
,因此引发异常。
由于验证失败,此false
值不会进入模型,甚至不会进入布尔元素True
值将转到模型并选择布尔值true
。因此验证通过,并且没有错误消息。在页面上,两个复选框均未选中,但在型号中,复选框1仍为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
@请求范围
公共类Bean{
检查私人名单;
私有列表选项=Arrays.asList(“第一”、“第二”);
公开作废提交(){
System.out.println(“选中:“+Checked”);
}
// ...
}
f:ajax
在这里工作得很好。您可能使用了event=“click”
而不是(默认)event=“valueChange”
,这将导致在渲染后不会保留复选标记。单击
即在复选标记设置之前调用。渲染将阻止在视觉上设置复选标记。请考虑
。以下是一个启动示例:
<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
@请求范围
公共类Bean{
检查私人名单;
私有列表选项=Arrays.asList(“第一”、“第二”);
公开作废提交(){
System.out.println(“选中:“+Checked”);
}
// ...
}
f:ajax
在这里工作得很好。您可能使用了event=“click”
而不是(默认)event=“valueChange”
,这将导致在渲染后不会保留复选标记。单击
即在复选标记设置之前调用。渲染将阻止在视觉上设置复选标记。您不能使用
的任何原因?是的,我不知道:)谢谢!我能补充一下吗?看起来f:ajax不起作用。请参阅答案。提示:若要通知其他人关于非自己帖子的评论回复,请使用@昵称
。另请参见,否则,您将依赖于他们在以后查看问题的热情。您不能使用
的任何原因?是的,我不知道:)谢谢!我能补充一下吗?看起来f:ajax不起作用。请参阅答案。提示:若要通知其他人关于非自己帖子的评论回复,请使用@昵称
。另请看,否则,您将依赖于他们的热情,以便在以后的时间回顾问题。谢谢@BalusC!:)我唯一的问题是,我在另一个表中创建了一个。比我在该元素后放置的任何内容都显示在表的复选框下面。有没有办法在“之后”表格中显示它?我的意思是在同一级别,在复选框表的右侧。使用CSS将其设置为display:inline代码>或<代码>浮动:左侧代码>。战斧的
也可能有帮助。你可以在任何你想要的地方定位。所以,完全控制标记。谢谢@BalusC!:)我唯一的问题是,我在另一个表中创建了一个。比我在该元素后放置的任何内容都显示在表的复选框下面。有没有办法在“之后”表格中显示它?我的意思是在同一级别,在复选框表的右侧。使用CSS将其设置为display:inline代码>或<代码>浮动:左侧代码>。战斧的
也可能有帮助。你可以在任何你想要的地方定位。因此,完全控制标记。