2012-04-17 10 views
2

WicketはPageParametersオブジェクトに次の種類のパラメータを両方とも渡すことができますか?どうやらないのですか? がURLにを示しているPageParametersの使用中にWicketページに情報メッセージを渡す

  • accountId/account/<ID>
  • infoMessageあるパラメータない私は、現在のページのIndexedHybridUrlCodingStrategyを使用しています(ブックマーク)URL

に示す 0 "と" infoMessage "のパラメータを試してみると、この例外が発生します:

WicketMessage:すべてのパラメータがエンコードされているわけではありません。すべての パラメータ名が0から始まる順番に整数であることを確認してください。 現在のパラメータ名は次のとおりです:[0、infoMessage]

私は「1」に「infoMessage」パラメータ名を変更した場合、それは動作しますが、(この場合は/account/42/Tosite%20108207%20tallennettiin.5のようなもの)醜いURLを生成するものではありませんいますが欲しいです。今


、明白な答えは、おそらくinfoMessageがPageParametersであってはならないということです。しかし、事はある、私はそうのように、代わりに通常のコンストラクタのパラメータとして、それを追加してみました:

public AccountPage(PageParameters parameters, String infoMessage) { 
    // ... 
} 

しかし、このアプローチは、一つの重要なユースケースには失敗します。アカウントに関連する永続的な "レコード"オブジェクトを削除した後、ではなく、はAccountPageを正しく読み込みます(削除されたレコードは引き続き表示されます)。このコードは、AjaxFallbackLinkのonClick()で実行されます。一方

setResponsePage(new AccountPage(AccountPage.pageParameters(account), message)); 

、私の独創的なアプローチ...

setResponsePage(AccountPage.class, AccountPage.pageParameters(account)); 

は...再び、それは何らかの形で "より徹底的に" AccountPageをロードして、正常に動作します、しかし、私はしないでくださいinfoMessageパラメータをきれいに渡す方法を知っている。

(上記AccountPage.pageParameters()が「0」=アカウントIDを有する適切なPageParametersを作成するための単純な静的なユーティリティである。AccountPageコンストラクタは常にIDを使用して永続性のアカウントをロードする。)

任意のアイデア?おそらく、AjaxFallbackLinkを使用すると部分的に問題が起こるでしょうか?

Wicket 1.4を使用しています。

答えて

4

あなたの質問には、ブックマーク可能なページを表示し、ユーザーにフィードバックメッセージ(おそらくFeedbackPanel)を表示しようとしますが、そのメッセージをURLの一部にしたくない。

Sessionに情報メッセージがあることを伝え、フィードバックパネルでメッセージを処理させます。

@Override void onSubmit() { 
    ... save object ... 
    getSession().info("Object ... has been saved"); 
    setResponsePage(ObjectPage.class, new PageParameters("id="+object.getId())); 
} 

この場合、フィードバックパネルによってレンダリングされるまで、Wicketにセッションにメッセージを一時的に保存するように指示します。このイディオムは、「フラッシュメッセージ」とも呼ばれます。

と別のパラメータをコンストラクタ引数として使用することはできません.Wicketはページが要求されたときにそのようなコンストラクタを使用してページインスタンスを作成できないためです。 Wicketは、PageParametersパラメータを持つデフォルトコンストラクタまたはページでページをインスタンス化する方法しか知りません。

+0

はい、これはまさに私がやろうとしていたものでした。ありがとう! getSession()。info()で保存されたメッセージが、ターゲットページのフィードバックパネルによって自動的に取得されることをうれしく思います。 – Jonik

関連する問題