【问题标题】:JSF AJAX validation: execute="@this" render="@form" inconsistent depending on prior requestsJSF AJAX 验证:execute="@this" render="@form" 根据先前的请求不一致
【发布时间】:2012-01-17 00:03:02
【问题描述】:

我有一个h:commandLink,它调用一个方法来更改绑定到无线电输入的属性。

我在同一个表单上也有一个文本输入,并进行了一些验证 (required=true)。

如果我将文本输入留空,然后单击h:commandLinkexecute="@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


【解决方案1】:

我对生命周期的理解正确吗?

是的。


我是不是做错了什么,或者这是 JSF 设计上令人讨厌的事情之一?

这是 JSF 的“令人讨厌的设计问题”之一。正如我对该相关问题的回答所述:

回到具体问题,我想这是 JSF2 规范中的疏忽。当 JSF 规范要求以下内容时,对我们 JSF 开发人员来说会更有意义:

  • 当 JSF 需要通过 ajax 请求更新/重新呈现输入组件,并且该输入组件未包含在 ajax 请求的处理/执行中,则 JSF 应重置输入组件的值。

我只是不记得我是否曾经根据 JSF 规范报告过这个问题。编辑:我报告了它:JSF spec issue 1060

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2023-04-02
  • 2020-08-20
  • 2021-03-11
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多