2015-11-18 57 views
2
<h:form id="formEdit"> 
    <p:selectOneMenu value="#{testView.selection}" 
        required="true"> 
     <f:selectItem itemValue="noMenu" itemLabel="selectOneMenu not rendered"/> 
     <f:selectItem itemValue="haveMenu" itemLabel="selectOneMenu rendered"/> 
     <p:ajax update="formEdit"/> 
    </p:selectOneMenu> 
    <p:panel> 
     <p:selectOneMenu id="conditionallyRnedered" value="#{testView.value}" 
         rendered="#{testView.selection eq 'haveMenu'}" 
         required="true"> 
      <f:selectItem itemValue="#{null}" itemLabel="-" noSelectionOption="true"/> 
     </p:selectOneMenu> 
    </p:panel> 
    <p:messages id="messages"/> 
    <p:commandButton value="Submit"/> 
</h:form> 

元器件"conditionallyRnedered"是必需的,并呈现的页面上后,我选择在第一菜单"haveMenu"值。这个组件只有空白选项,并且初始化它没有在页面上呈现。如果我按下提交按钮,然后反应是:primefaces不验证AJAX渲染分量

<partial-response><changes> 
<update id="javax.faces.ViewState"><![CDATA[stateless]]></update> 
</changes></partial-response> 

没有验证错误。如果我从"#{testView.selection eq 'haveMenu'}"改变"conditionallyRnedered"rendered属性的值只是"true",则反应是:

<partial-response><changes> 
<update id="javax.faces.ViewState"><![CDATA[stateless]]></update> 
<extension ln="primefaces" type="args">{"validationFailed":true}</extension></changes> 
</partial-response> 

验证错误返回。问题是:

  1. 为什么有条件渲染的组件未验证?
  2. 有可能让他们验证?

UPD 本来在我的问题是不存在的Bean源代码,其中豆声明为@ViewScoped。在阅读@BalusC comment后,我尝试将范围从@ViewScoped更改为@SessionScoped,之后验证工作正常。其中javax.faces.ViewState响应从stateless改变一些观点ID:

<update id="javax.faces.ViewState">-5902669082498843838:729675320168079573</update> 

我仍然怀疑,这是解决方案或仍在解决方法,因为我认为,虽然我们不离开页面@ViewScoped bean的实例存在。也许这种行为是由于在同一页面呈现另一个bean的事实造成的,其范围为@SessionScoped

+1

@MahendranAyyarsamyKandiar不,结果是一样的。属性'update'正在工作 - 有条件渲染的组件在ajax请求后显示在窗体上。组件'p:messages'没有用处,因为响应中没有验证错误,没有任何显示。 – bobzer

+0

我已添加答案。请检查它是否有效 –

+0

为什么在您的xhtml中添加了? –

回答

3

由于本Q & A:Form submit in conditionally rendered component is not processed中解释的技术原因而失败。简而言之,在处理表单提交/转换/验证期间,JSF将重新检查rendered属性,并跳过那段时间内未呈现的组件。答案是使用@ViewScoped bean。

,它仍然失败,尽管你实际上正在使用,一个@ViewScoped bean是因为你通过<f:view transient="true">使用无状态视图通过实际javax.faces.ViewState价值What is the usefulness of statelessness in JSF?换句话说证实,JSF不会救/恢复视图,包括任何视图范围的bean。这些bean在技术上的行为与@RequestScoped bean类似,因此可以在每次请求时重新创建,并且每次都将其属性重置为默认值。

解决您的问题,只要关闭无国籍鉴于消除<f:view transient="true">,并保持你的bean @ViewScoped

+0

我在我的页面添加了。即使我的“解决方案”验证信息没有进入。那么为什么OP在我的问题上评论说:“谢谢,这个解决方案工作正常!” - 10个小时前的bobzer。它是如何为他工作的?我很困惑,为什么它为他工作。你能解释一下,如果你有一些时间吗? –

+0

我测试过没有,我有@ViewScoped就像你提到的那样。删除了我的“解决方法”点击“提交”按钮仍然没有验证信息。我在web.xml中没有上下文参数javax.faces.STATE_SAVING_METHOD。 –

+0

我试过导入javax.faces.bean.ViewScoped;现在没有我的“解决方法”。仍然不起作用。我仍在学习, –

-1

@bobzer,

primefaces的commandButton已经成为阿贾克斯= “真” 默认情况下。所以,当我设置的ajax = “false” 时,提交表单时,我可以看到验证错误

我得到validation error coming

我的XHTML:

<h:form id="formEdit"> 
    <p:selectOneMenu value="#{testView.selection}" required="true"> 
     <f:selectItem itemValue="noMenu" 
      itemLabel="selectOneMenu not rendered" /> 
     <f:selectItem itemValue="haveMenu" itemLabel="selectOneMenu rendered" /> 
     <p:ajax update="formEdit" /> 
    </p:selectOneMenu> 
    <p:panel> 
     <p:selectOneMenu id="conditionallyRnedered" value="#{testView.value}" 
      rendered="#{testView.selection eq 'haveMenu'}" required="true"> 
      <f:selectItem itemValue="#{null}" itemLabel="-" 
       noSelectionOption="true" /> 
     </p:selectOneMenu> 
    </p:panel> 
    <p:messages id="messages" /> 
    <p:commandButton value="Submit" ajax="false"/> 
</h:form> 

我的豆

 package citi.manageID.framework.admin.roleMgmt; 

    import javax.faces.view.ViewScoped; 
    import javax.inject.Named; 

    @Named 
    @ViewScoped 
    public class TestView { 


     private String selection=""; 

     private String value=""; 

     public String getSelection() { 
      return selection; 
     } 

     public void setSelection(String selection) { 
      this.selection = selection; 
     } 

     public String getValue() { 
      return value; 
     } 

     public void setValue(String value) { 
      this.value = value; 
     } 


    } 
+4

这不是一个解决方案。这是一种解决方法。请仔细关注OP的ajax响应中的javax.faces.ViewState值,以找到真正的解释和答案。 – BalusC

+0

@BalusC 我在我的页面中添加了。即使我的“解决方案”验证信息没有进入。那么为什么OP在我的问题上评论说:“谢谢,这个解决方案工作正常!” - 10个小时前的bobzer。 –

+0

我测试过没有,我有@ViewScoped就像你提到的那样。删除了我的“解决方法”点击“提交”按钮仍然没有验证信息。我在web.xml中没有上下文参数javax.faces.STATE_SAVING_METHOD有没有下降的人甚至以这种方式测试答案? –