2013-01-10 48 views
0

我正在開發一個JSF 2.0和豐富的面孔4.2.3的Web應用程序。 我有一個帶有標籤面板的頁面,如下所示(代碼在最後給出)。JSF 2驗證與豐富的面孔tabbedPanel導致問題

我現在面臨以下問題:

當點擊選項卡,確認被炒魷魚和第二片沒有得到顯示(因爲文本字段沒有任何值設置,驗證失敗)。 這是因爲,當單擊一個選項卡時,會觸發POST請求,導致驗證調用。 我該如何解決這個問題?

其中一個選項可能是將switchType更改爲「客戶端」。但是當點擊標籤時,更新的數據將不會顯示。

<h:form>  
    <rich:tabPanel switchType="client"> 

     <rich:tab header="UserManagement"> 
      <rich:tabPanel switchType="client"> 
        <rich:tab header="AddUser"> 

        <h:form>      
         <h:panelGrid id="addUserForm" columns="3"> 

           Enter Name : 
           <h:inputText id="name" value="#{userBean.name}" 
            required="true" requiredMessage="User Id Required."> 
           </h:inputText> 
           <h:message for="name"></h:message> 

           Enter passWord : 
           <h:inputText id="passWord" value="#{userBean.passWord}" required="true" requiredMessage="PassWord Required.">      
           </h:inputText> 
           <h:message for="passWord"></h:message> 

           Roles : 
           <h:selectOneMenu id="roles" value="#{userBean.roleId}"> 
               <f:selectItems value="#{userBean.roles}"/> 
           </h:selectOneMenu>  
           <h:message for="roles"></h:message> 

           <h:commandButton action="#{userBean.addUser}" 
                value="Add User"> 
             <f:ajax render="addUserForm" execute="@form"></f:ajax> 
           </h:commandButton> 
         </h:panelGrid> 
        </h:form> 

        </rich:tab> 
        <rich:tab header="EditUser"> 

         <h:form> 

          <h:panelGrid id="editUserForm" columns="3"> 

            Enter passWord : 
            <h:inputText id="passWord" value="#{userBean.passWord}" required="true" requiredMessage="PassWord Required.">      
            </h:inputText> 
            <h:message for="passWord"></h:message> 

            Roles : 
            <h:selectOneMenu id="roles" value="#{userBean.roleId}"> 
                <f:selectItems value="#{userBean.roles}"/> 
            </h:selectOneMenu>  
            <h:message for="roles"></h:message> 

            <h:commandButton action="#{userBean.editUser}" 
                 value="Edit User"> 
              <f:ajax render="editUserForm" execute="@form"></f:ajax> 
            </h:commandButton> 
          </h:panelGrid> 
         </h:form> 

        </rich:tab>       
      </rich:tabPanel> 

     </rich:tab>  

     <rich:tab header="DeviceManagement"> 
     </rich:tab>  

    </rich:tabPanel> 
</h:form> 

回答

0

你已經在做一件非常錯誤的事情,那就是嵌套<h:form/> s。表單嵌套在HTML和擴展JSF中都是非法的。即使你的觀點沒有其他錯誤,那麼這種構建會在以後給你帶來嚴重的麻煩。見thisthis答案

驗證正在對標籤點擊觸發,因爲在這一天結束時,所有組件都在同一<h:form/>內集中。因此,該表單中的任何操作都將提交該表單中的所有組件。您必須擺脫最上面的<h:form/>並相應地重構您的組件。此外,您可以選擇使用<a4j:commandButton process="someId" ajaxSingle="true"/>處理視圖組件,指定要提交處理的組件的clientId

+0

如果我從頂部刪除,則當通過瀏覽器訪問頁面時,頁面上會顯示警告(mozilla)如下所示:表單組件需要在其祖先中具有UIForm。建議:在之內附上必要的組件。我是否總是需要在表單元素中包含rich:tabPanel? – Atul

+0

@Atul,JSF中的經驗法則是,如果它沒有提交任何用於服務器端處理的內容,則不需要將其封裝在表單中。你可以[(在理論上)忽略]這個信息(http://stackoverflow.com/q/12749850/1530938)。在這種情況下,你可以做的事情是在單個''中包裝頂層'',並將javax.faces.PROJECT_Stage' context-param(在你的web.xml中)設置爲「production」(這很重要的那個警告) – kolossus

+0

,將javax.faces.PROJECT_Stage設置爲生產時刪除了警告。有關您的建議的一個問題:將頂級 s包裝在個人中,爲什麼這需要?在上面粘貼的代碼中,h:form存在於rich:tab中,並且它完美地工作(不在rich:tab之外)。如果我在h:form中包含頂層選項卡,那麼兩個子選項卡都將在相同的h:表單(AddUser和EditUser)。 – Atul