0

JSF2.0とリッチフェイス4.2.3を使用してWebアプリを開発しています。以下のようにタブ付きパネルが互いに入れ子になっているページがあります(コードは最後にあります)。

私は次の問題に直面しています:

タブがクリックされると、検証が実行され、2番目のタブは表示されません(テキストフィールドには値が設定されていないため、検証は失敗します)。これは、タブがクリックされると、POSTリクエストが発生し、検証が呼び出されるためです。どうすればこれを回避できますか?

オプションの1つは、switchTypeを「client」に変更することです。ただし、タブをクリックしても更新されたデータは表示されません。

<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>
4

1 に答える 1

0

あなたはすでにそこに非常に間違ったことを1つやっています。それはネスト<h:form/>です。フォームのネストは、HTMLと拡張JSFの両方で違法です。あなたの見解に他に何も問題がなかったとしても、その構成だけで後で深刻な頭痛の種になります。これこの答えを参照してください

1日の終わりに、すべてのコンポーネントが同じ内にまとめられるため、タブクリックで検証がトリガーされます<h:form/>。その結果、そのフォーム内のアクションは、そこにあるすべてのコンポーネントの全体を送信します。最上位を取り除き、<h:form/>それに応じてコンポーネントを再構築する必要があります。<a4j:commandButton process="someId" ajaxSingle="true"/>さらに、処理のために送信するコンポーネントのclientIdを指定して、ビューコンポーネントを選択的に処理できます。

于 2013-01-12T05:34:50.347 に答える