3

私はこのようなことをしたいです(いくつかの条件に応じて別のページにリダイレクトしてください!):

<ui:fragment rendered="#{projectPageBean.availableMethods}">
    <p:commandButton id="test"
        value="View Instrument"
        action="instrumentLayout?faces-redirect=false"/>                                 
</ui:fragment>
<ui:fragment rendered="#{not projectPageBean.availableMethods}">
    <p:commandButton id="test1"
        value="View Instrument"
        action="methodLayout?faces-redirect=false"/>       
</ui:fragment>

しかし、この構造は機能していないようです。アクション属性のページ リダイレクトは実行されません。

この動作を正しくするにはどうすればよいですか?

4

1 に答える 1

4

フォーム送信の処理中に、rendered改ざんされたリクエストに対する保護の一環として、入力/コマンド コンポーネントとそのすべての親の属性が再評価されます。と評価された場合false、子の入力/コマンド コンポーネントはデコードされず、送信された値は設定されず、呼び出されたアクションはキューに入れられません。

どうやらそれがここで起こっていることです。Bean をビュー スコープに配置すると解決するはずです。

@ManagedBean
@ViewScoped
public class ProjectPageBean {}

このようにして、(ajax) ポストバックによって同じビューを操作している限り、Bean は存続します。

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


具体的な問題とは関係ありませんが、単純なページ間ナビゲーションにコマンド ボタンを使用するのは非常に奇妙です。そのためには、通常のボタンを使用することをお勧めします。

<ui:fragment rendered="#{projectPageBean.availableMethods}">
    <p:button id="test"
        value="View Instrument"
        outcome="instrumentLayout"/>
</ui:fragment>
<ui:fragment rendered="#{not projectPageBean.availableMethods}">
    <p:button id="test1"
        value="View Instrument"
        outcome="methodLayout"/>
</ui:fragment>

これにより、具体的な問題も解決されます。ポストバックを実行する代わりに、指定された URL で単純な GET リクエストを送信するだけで、すべての JSF フォーム処理が実行され、最終的に別の GET リクエストがリダイレクトとして送信されます。したがって、不器用さがはるかに少なくなります。<h:form>これらのボタンは、この方法の外側に安全に配置できることに注意してください。

<h:link styleClass="ui-button ui-state-default ui-corner-all">の代わりに作成すると<p:button>、さらに SEO フレンドリーになります (つまり、Googlebot のような検索ボットは、それらをより適切に見つけてインデックスに登録できます)。

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

于 2013-06-25T12:54:23.230 に答える