JSF AJAX验证:执行=“@ this”render =“@ form”不一致,具体取决于先前的请求

时间:2011-12-09 18:08:31

标签: ajax validation jsf

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

我在同一表格上也有一个文字输入,有一些验证(required = true)。

如果我将文本输入留空,并使用h:commandLink单击execute="@this,则单选按钮会根据预期从模型属性更新,因为文本输入永远不会被处理,并且验证永远不会触发。 / p>

但是,如果首先点击其他h:commandLink execute="@form"然后execute="@this"的链接,验证消息就会消失,但是单选按钮即使单选按钮的UIInput从未处于无效状态,值也会从模型中而不是更新。

我发现execute="@this"的行为方式有所不同,这取决于我以前做过的事情,当我@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
 }

1 个答案:

答案 0 :(得分:6)

  

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


  

我做错了什么,或者这是关于JSF的烦人设计事情之一?

这是JSF的“烦人的设计之物”之一。正如我在该相关问题的答案中所述:

  

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

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

如果我曾经针对JSF规范报告此事,我只是不记得了。编辑:我报告了它:JSF spec issue 1060