2

私は自分のアプリを「ブックマーク可能」にしようとしていますが、それを実現するためにビューパラメーターを使用しています。

そして、これや他の多くのことを読んだ後でも、JSFでそれを正しく行うための正しい方法がまだ得られていないと思います。

私の問題は、ajax以外のポストバック後にgetパラメーターが失われることです。つまり、パラメーター値はBeanに設定されたままで、アプリは正しく機能しますが、URLから削除され、URLが無効になります。

たとえば、http://company.com/users?id = 4のようなURLを使用すると、そのページがajax以外のポストバック(データのアップロードなど)を実行するとすぐに、URLはhttp ://companyになります。 com/users。アプリは引き続き正常に動作しますが、リンクは「ブックマーク可能」ではなくなります。

非ajaxポストバックがURLからviewParamsを削除するのを防ぐ方法はありますか?

私のユースケースは、オブジェクトを編集するためにページをブックマークできるようにすることであり、そこでデータをアップロードできる必要があります(そうでない場合は、ajax以外のポストバックを使用しません)。オブジェクトのデータのみを表示するためにページをブックマークしたい場合は、ポストバックは必要ないことはわかっていますが、そうではありません。

同じパラメーターを使用して同じページにリダイレクトし、アプリにビュースコープのBeanを再作成させることもできますが、リクエストスコープのBeanに勝るメリットは実際にはありません...

どんな提案でも大歓迎です。

4

1 に答える 1

2

この動作は「仕様による」ものです。は、ビューパラメータのないURLを含む<h:form>HTML<form>要素を生成します。action同期POSTリクエストは、まさにそのURLに送信するだけなので、ブラウザのアドレスバーにそのまま反映されます。ビューパラメータをURLに保持する場合、ajaxを使用することはできませんが、基本的には、ビューパラメータを含めるためにオーバーライドされるカスタムViewHandlerを作成する必要があります。getActionURL()このメソッドは、 URL<h:form>を生成するためにによって使用されます。action

public String getActionURL(FacesContext context, String viewId) {
    String originalActionURL = super.getActionURL(context, viewId);
    String newActionURL = includeViewParamsIfNecessary(context, originalActionURL);
    return newActionURL;
}

または、すでにOmniFacesを使用しているコメントに基づいているため、基本的にを拡張する<o:form>コンポーネントを使用して、およびと同じように機能<h:form>する属性を使用することもできます。includeViewParams<h:link><h:button>

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

このようにして、すべての<f:viewParam>値がフォームアクションURLになります。

参照:

于 2013-01-07T15:55:08.083 に答える