【发布时间】:2012-01-17 00:03:02
【问题描述】:
我有一个h:commandLink,它调用一个方法来更改绑定到无线电输入的属性。
我在同一个表单上也有一个文本输入,并进行了一些验证 (required=true)。
如果我将文本输入留空,然后单击h:commandLink 和execute="@this,则单选按钮会按预期从模型属性更新,因为永远不会处理文本输入并且永远不会触发验证。
但是,如果首先我用execute="@form" 点击不同的h:commandLink,然后点击带有execute="@this" 的链接,验证消息会消失,但单选按钮的值不会 从模型更新,即使单选按钮的 UIInput 从未处于无效状态。
当我对@this 的意图是强制从模型更新所有内容并忽略来自组件的任何提交的值时,execute="@this" 的行为会因我之前所做的不同而有所不同,这很烦人。
我怀疑正在发生的事情是这样的:
- 使用
@form,单选按钮和文本都被处理。 - 单选按钮有效,因此设置了
localValue - 由于无效的文本输入,过程验证阶段总体失败,因此
localValue保持设置状态,不会被清除或传播到value - 解决此问题的唯一方法是显式调用
resetValue()或重新处理有问题的组件(例如execute="@this radio")以清除localValue,然后允许从bean 刷新。
我的问题是:
- 我对生命周期的理解正确吗?
- 我是不是做错了什么,或者这是 JSF 设计上令人讨厌的事情之一?
感觉这可能只是这个问题的另一个例子
How can I populate a text field using PrimeFaces AJAX after validation errors occur?
不幸的是,我觉得我最近发现了很多这样的东西。 :-(
下面的代码示例:
<h:form>
<h:messages/>
Radio =
<h:selectOneRadio value="#{testBean.radioValue}" id="radio" binding="#{radio}">
<f:selectItem itemValue="foo" itemLabel="Foo"/>
<f:selectItem itemValue="bar" itemLabel="Bar"/>
</h:selectOneRadio>
<br></br>
radio bean value = <h:outputText value="#{testBean.radioValue}"/>
<br></br>
radio UIInput localValue = <h:outputText value="#{radio.localValue}"/>
<br></br>
radio UIInput value = <h:outputText value="#{radio.value}"/>
<br></br>
String w/validation = <h:inputText value="#{testBean.stringValue}" required="true" />
<br></br>
<ul>
<li>
<h:commandLink actionListener="#{testBean.changeRadioValue}" value="execute = @form">
<f:ajax render="@form" execute="@form"/>
</h:commandLink>
</li>
<li>
<h:commandLink actionListener="#{testBean.changeRadioValue}" value="execute = @this">
<f:ajax render="@form" execute="@this"/>
</h:commandLink>
</li>
<li>
<h:commandLink actionListener="#{testBean.changeRadioValue}" value="execute = @this radio">
<f:ajax render="@form" execute="@this radio"/>
</h:commandLink>
</li>
</ul>
</h:form>
还有这个豆子:
@ManagedBean
@ViewScoped
public class TestBean {
private String radioValue = "foo";
private String stringValue;
public void changeRadioValue() {
radioValue = "bar";
}
// + getters/setters
}
【问题讨论】:
-
我遇到了类似的问题。也就是说,尽管 AJAX 响应中包含相关的表单元素,但没有调用有效组件的 getter。我通过在所有表单输入上设置
transient="true"来解决这个问题。至少对 PrimeFaces 来说是一种享受。 (我还没有尝试过使用普通的旧 JSF 组件和 AJAX。)
标签: ajax validation jsf