验证失败后,我想将JSF输入重置为其原始托管bean值。

我在同一页面中有两个表单-第一个表单具有commandLink来初始化第二个表单。第二种形式呈现为一个对话框,其可见性通过jQuery切换-但出于本练习的目的,我只能在同一页面上以两种形式进行说明。另外,当我在应用程序中使用PrimeFaces 2.2.x时,常规的h:commandLink也会出现相同的行为。

我遇到的问题是:


单击第一种形式的链接以初始化第二种形式
以第二种形式提交无效值
再次单击第一种形式的链接以初始化第二种形式-仍然存在无效值和/或UIInput状态仍然无效。


例如-采用以下形式

<h:form id="pageForm">
    <h:commandLink actionListener="#{testBean.initialize}">Initialize, no execute
        <f:ajax render=":dialogForm"/>
    </h:commandLink>
    <br/>
    <h:commandLink actionListener="#{testBean.initialize}">Initialize, execute=@this
        <f:ajax execute="@this" render=":dialogForm"/>
    </h:commandLink>

</h:form>

<h:form id="dialogForm">
    <h:messages/>
    String property - Valid: <h:outputText value="#{property.valid}"/>
    <br/>
    <h:inputText id="property" binding="#{property}" value="#{testBean.property}">
    <f:validateLength minimum="3"/>
    </h:inputText>
    <br />
    Int property - Valid: <h:outputText value="#{intValue.valid}"/>
    <h:inputText id="intValue" binding="#{intValue}" value="#{testBean.intValue}">
        <f:validateLongRange maximum="50" />
    </h:inputText>
    <br/>

    <h:commandLink actionListener="#{testBean.submit}">
        Submit
        <f:ajax render="@form" execute="@form"/>
    </h:commandLink>

    <h:commandLink actionListener="#{testBean.initialize}">Initialize, execute=@this
        <f:ajax execute="@this" render="@form"/>
    </h:commandLink>

</h:form>


Bean类:

@ManagedBean
@ViewScoped
public class TestBean {
  private String property = "init";
  private Integer intValue = 33;
  // plus getters/setters

  public void submit() { ... }
  public void initialize() {
   intValue = 33;
   property = "init";
  }

}


行为1


单击pageForm上的“初始化”链接
输入被初始化为“ init”,“ 33”
现在为两个字段(例如“ aa”,“ 99”)提交无效的内容
现在再次单击任何“初始化”链接(它们似乎都表现相同-格式相同或不同,或者是否指定了execute =“ @ this”都没有区别。)


结果=> UIInput.isValid() =假,两个值虽然都复位(“ init”,“ 33”)。

预期=>有效=真(或者这不合理吗?)

行为2


单击pageForm上的“初始化”链接
输入被初始化为“ init”,“ 33”
现在提交对文本字段无效但对int字段有效的内容(“ aa”,“ 44”)
现在再次单击任何“初始化”链接


结果=>“ init”,有效=假; 44,有效= true

预期=>“ init”,有效= true; 33,有效= true

我也看了看:

JSF 2 - Bean Validation: validation failed -> empty values are replaced with last valid values from managed bean



How can I populate a text field using PrimeFaces AJAX after validation errors occur?

UIInputs显式重置resetValue状态的建议确实可行,但我对此并不满意。

现在,我有点理解为什么不重置isValid了-我对JSF生命周期的理解是,一旦将值提交给组件,就不会重置isValid,直到组件成功提交并验证并且Update Model Values阶段设置了豆值。因此,在这种情况下,可能没有办法显式地重置有效状态,因为我想将#{foo.valid}用于条件CSS样式。

但是,我不明白的是,为什么没有通过bean重新初始化成功验证的组件。也许我对JSF生命周期的了解有些微了?

我了解答案How can I populate a text field using PrimeFaces AJAX after validation errors occur?中列出的规则,因为它们与单个组件有关,但与整个表单无关,即,如果某个组件成功通过验证但验证整体失败,会发生什么?

最佳答案

实际上,可能没有比在组件上显式调用resetValue更好的方法了。在我的情况下,所有对话框都与打开它们的基础页面在同一个JSF大视图树中。因此,从JSF的角度来看,应保留包括无效输入值在内的相同视图组件状态,直到我们离开视图为止,因为它对于我们如何切换客户端的显示属性不具有可见性。

唯一可行的其他方法是,除非构成对话框的组件实际上不可见,否则它们实际上不会在JSF视图树中呈现。就我而言,它们总是使用CSS切换可见性进行渲染。

10-06 12:41
查看更多