3

ap:tab を含む多くのコンポーネントを含むフォーム全体があります

p:commandButton id=c1をクリックしてフォームのコンテンツ全体を送信すると:

  • フォームの必須メッセージ全体を検証する必要がありますが、p:tab の必須メッセージ フィールドは無視する必要があります。
  • p:tab 内の p:commandButton id=c2をクリックすると、p:tab 内の必要なメッセージ フィールドのみを検証する必要があります。

これに対する最善の解決策は何ですか? 前もって感謝します。

4

2 に答える 2

8

「神の形」アンチパターンを使用しているようです。すべてが 1 つの にまとめられ<h:form>ます。これは貧弱な設計/慣行です。最も賢明な方法は、フィールドとボタンを別々のフォームに配置して、関連するフィールドとボタンのみを独自のフォームに配置し、フォームの送信が他のフォームの無関係なデータを不必要に送信/処理/変換/検証しないようにすることです。

以下も参照してください。


いくつかの (奇妙な?) 設計上の制限のためにそれが不可能な場合は、少なくとも 2 つの方法があります。

  1. ajax を使用している場合は、process属性を利用できます。デフォルト@formでは、フォーム全体を処理します。送信中に処理したい入力フィールドの (相対) クライアント ID のスペースで区切られた文字列を受け入れます。

    <p:inputText id="field1" ... required="true" />
    <p:inputText id="field2" ... required="true" />
    ...
    <p:inputText id="field3" ... required="true" />
    <p:inputText id="field4" ... required="true" />
    ...
    <p:commandButton id="c1" ... process="field1 field2" />
    ...
    <p:commandButton id="c2" ... process="field3 field4" />
    

    関連項目: PrimeFaces のプロセス/更新と JSF f:ajax の実行/レンダリング属性について

  2. ajax を使用していない場合、または ajax 以外のフォールバックが必要な場合は、requiredボタンが押された属性をチェックインしてください。これは、リクエスト パラメータ マップ内のボタンのクライアント ID の存在を確認することで簡単に行えます。

    <p:inputText id="field1" ... required="#{not empty param[c1.clientId]}" />
    <p:inputText id="field2" ... required="#{not empty param[c1.clientId]}" />
    ...
    <p:inputText id="field3" ... required="#{not empty param[c2.clientId]}" />
    <p:inputText id="field4" ... required="#{not empty param[c2.clientId]}" />
    ...
    <p:commandButton id="c1" binding="#{c1}" ... />
    ...
    <p:commandButton id="c2" binding="#{c2}" ... />
    

    (注: c1orに必要な追加の Bean プロパティはありませんc2。コードはそのままです)

    押されたボタンに応じて検証を行う方法も参照してください。

    より自己文書化された変数名を使用して、これをいくらかリファクタリングできます。

    <c:set var="c1ButtonPressed" value="#{not empty param[c1.clientId]}" />
    <c:set var="c2ButtonPressed" value="#{not empty param[c2.clientId]}" />
    ...
    <p:inputText id="field1" ... required="#{c1ButtonPressed}" />
    <p:inputText id="field2" ... required="#{c1ButtonPressed}" />
    ...
    <p:inputText id="field3" ... required="#{c2ButtonPressed}" />
    <p:inputText id="field4" ... required="#{c2ButtonPressed}" />
    ...
    <p:commandButton id="c1" binding="#{c1}" ... />
    ...
    <p:commandButton id="c2" binding="#{c2}" ... />
    
于 2013-07-03T15:21:25.860 に答える