1

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

4

1 回答 1

1

如果组件在验证阶段UIInput抛出 a ,那么 JSF 将自动调用with 。因此,这意味着您可以在视图中使用来检查特定组件是否已通过验证。ValidatorExceptionUIInput#setValid()falseUIInput#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

于 2013-01-04T12:49:24.547 回答