我想在验证失败后将JSF输入重置为原始托管bean值。
我在同一页面中有两个表单 - 第一个表单有一个commandLink
来初始化第二个表单。第二种形式呈现为一个对话框,其可见性通过jQuery切换 - 为了本练习的目的,我可以在同一页面上用两个表单来说明。此外,当我在我的应用程序中使用PrimeFaces 2.2.x时,同样的行为也会出现在常规h:commandLink
中。
我遇到的问题是:
例如 - 采取以下形式
<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
结果=&gt; UIInput.isValid()
= false,两个值都重置(“init”,“33”)。
预期=&gt; valid = true(或者这不合理吗?)
行为#2
结果=&gt; “init”,valid = false; 44,有效=真
预期=&gt; “init”,valid = true; 33,有效=真
我也看过:
和
How can I populate a text field using PrimeFaces AJAX after validation errors occur?
使用UIInputs
明确重置resetValue
状态的建议确实有效,但我对它不满意。
现在,我理解为什么isValid没有重置 - 我对JSF生命周期的理解是,一旦将值提交给组件,isValid就不会被重置,直到成功提交和验证组件并且更新模型值phase设置bean值。因此,在这种情况下,可能无法明确重置有效状态,因为我想使用#{foo.valid}
进行条件CSS样式。
但是,我不明白的是,成功验证的组件没有从bean重新初始化的原因。也许我对JSF生命周期的理解有点偏差?
我理解规则在How can I populate a text field using PrimeFaces AJAX after validation errors occur?的答案中列出,因为它们与单个组件有关,但与整个表单无关 - 即,如果组件成功验证但验证整体失败会发生什么?
答案 0 :(得分:0)
事实上,可能没有比在组件上显式调用resetValue
更好的方法了。在我的例子中,所有对话框都在同一个大JSF视图树中,底层页面打开它们。因此,从JSF的角度来看,在我们离开视图之前,应该保留包含无效输入值的相同视图组件状态,因为它无法看到我们如何在客户端切换显示属性。
可能工作的唯一另一件事是,构成对话框的组件实际上没有在JSF视图树中呈现,除非它们可见。就我而言,它们总是被渲染,使用CSS来切换可见性。