验证失败后,我想将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切换可见性进行渲染。