2015-11-18 58 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有沒有下降的人甚至以這種方式測試答案? –