使用ajax时如何检查验证错误并做出反应

时间:2013-01-04 12:36:07

标签: ajax validation jsf-2

我有h:selectOneListbox,其属性为required="true"。使用a4j:ajax的客户端验证工作正常。

如果完成了有效选择,则会渲染另一个面板组。

示例:

<h:selectOneListbox 
....
id="first" 
....
 required="true"
>
<a4j:ajax event="valueChange"  render="secondGroup" listener="#{myController.anotherMethodINeed}"/>
</h:selectOneListbox>

<!-- the other panel -->


<h:panelGroup id="secondGroup" layout="none">
     <h:panelGroup id="secondGroupCheck" layout="none" rendered="#{not empty model.first}">

     </h:panelGroup>
</h:panelGroup>

这也有效。

问题在于:

如果用户现在在第一个选择框中选择非法值(如空的那个),则在客户端验证输入。因此,信息永远不会成为模型。在第一次有效输入后,始终呈现面板。没有办法让它再次消失,因为服务器不知道变化。

我知道的唯一解决方法是为这样的字段制作自定义验证器。如果需要渲染面板,验证器会设置一个标志。然后可以使用此标志来确定是否应该呈现面板组。

有没有更聪明的方法来做到这一点?

我知道我可以使用类似rendered="#{not facesContext.validationFailed}"的内容来检查所有字段,但我不知道只检查一个字段的方法。

1 个答案:

答案 0 :(得分:1)

如果UIInput组件在验证阶段投出ValidatorException,则JSF会自动使用false调用UIInput#setValid()。这意味着您可以在视图中使用UIInput#isValid()来检查特定组件是否已通过验证。

您可以使用binding属性将UIInput组件绑定到视图,然后以通常的EL方式访问其所有属性。

<h:selectOneListbox id="first" binding="#{first}" ... required="true">
    ...
    <a4j:ajax listener="#{myController.anotherMethodINeed}" render="secondGroup" />
</h:selectOneListbox>

<h:panelGroup id="secondGroup">
    <h:panelGroup id="secondGroupCheck" rendered="#{not empty model.first and first.valid}">
        ...
    </h:panelGroup>
</h:panelGroup>

顺便说一下,layout="none"<h:panelGroup>的无效属性,所以我省略了它。此外,event="valueChange"<a4j|f:ajax>内部UIInput组件的默认值,因此我省略了它。