【问题标题】:How to check and react on validation fault, while using ajax如何在使用 ajax 时检查验证错误并做出反应
【发布时间】:2012-12-18 21:39:46
【问题描述】:

我有一个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}" 之类的东西来检查所有字段,但我不知道只检查一个字段的方法。

【问题讨论】:

    标签: ajax validation jsf-2


    【解决方案1】:

    如果UIInput 组件在验证阶段抛出ValidatorException,则JSF 将自动调用UIInput#setValid()false。这意味着您可以在视图中使用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"&lt;h:panelGroup&gt; 的无效属性,所以我省略了它。另外,event="valueChange" 已经是 &lt;a4j|f:ajax&gt; 内部 UIInput 组件的默认值,所以我省略了它。

    【讨论】:

      猜你喜欢
      • 2018-04-23
      • 2021-08-04
      • 2010-11-26
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 2021-04-26
      • 2023-03-25
      相关资源
      最近更新 更多