4

シンプルなフォームの xhtml ページがあります。このページは、いくつかのデータ テーブルに使用されています。データ テーブルなどを指定するには、GET 要求パラメーターを使用します。xhtmlページがそれを受け取ります

  <f:metadata>
    <f:viewParam id="page" name="page" value="#{itemsBean.page}"/>
  </f:metadata>

次のようなナビゲーションルールで再び通過します

  <navigation-case>
  <description>
  Global rule for going to the items page from any page  
  </description>
  <from-outcome>items</from-outcome>
  <to-view-id>/items.xhtml</to-view-id>
  <redirect>
    <view-param>
      <name>page</name>
      <value>#{itemsBean.page}</value>
    </view-param>  
  </redirect>  
  </navigation-case>

しかし、このようにxhtmlファイルで入力を使用すると

  <h:inputText id="itemName" value="#{itemsBean.name}" 
    required="true" requiredMessage="Value for this field required!"/>

入力にテキストのないフォームを受け入れようとした後、ビュー パラメータを復元できません。パラメータを渡すために非表示の入力を使用しようとしました

<h:inputHidden id="page" value="#{itemsBean.page}" />

、しかし、検証が前に実行され、itemsBean.page がまだ空であるようです。itemsBean は RequestScoped です。私が間違っていることは何ですか?どうすればパラメータを渡すことができますか?

時間を無駄にしていただきありがとうございます。

4

1 に答える 1

3

後続のリクエストにリクエスト パラメータを渡し続ける必要があります。「プレーンなバニラ」HTML では、実際に<input type="hidden">これを使用していたはずですが、残念ながら JSF<h:inputHidden>はそのようには機能しません。別の入力フィールドが原因で一般的な検証が失敗した場合、関連付けられているモデル値<h:inputHidden>はまったく更新されません。

後続のリクエストのリクエスト パラメータを保持するには、代わりにコンポーネント<f:param>でa を使用する必要があります。UICommand例えば

<h:commandButton ...>
    <f:param name="page" value="#{param.page}" />
</h:commandButton>

または、OmniFaces JSF ユーティリティ ライブラリの を使用することもできます<o:form>これは基本的に、フォーム アクション URL で後続のリクエストのビュー パラメータを保持できるようにする<h:form>追加の属性で を拡張します。includeViewParams

<o:form includeViewParams="true">
    ...
</o:form>

複数のコマンド ボタン/リンクと ajax アクションがある場合は、これがより簡単になる可能性があります。非 ajax ポストバック中に同じ URL を保持したい場合は、これが唯一の方法です。

于 2012-09-07T12:29:51.620 に答える