2

Wicket はどうにかして PageParameters オブジェクトで次の種類のパラメーターの両方を渡すことができますか? どうやらそうではありませんか?

  • accountIdURLに表示さます ( /account/<ID>)
  • infoMessage(ブックマーク可能な) URL に表示されないパラメーター

現在、問題のページに IndexedHybridUrlCodingStrategy を使用しており、パラメーター「0」と「infoMessage」を試すだけで次の例外が発生します。

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

「infoMessage」パラメーター名を「1」に変更すると機能しますが、/account/42/Tosite%20108207%20tallennettiin.5必要ではない醜い URL (この場合は のようなもの) が生成されます。


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

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

しかし、このアプローチは 1 つの重要なユース ケースで失敗します。アカウントに関連する永続的な「レコード」オブジェクトを削除した後、次のコマンドは 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 を部分的に使用すると問題が発生するのでしょうか?

ウィケット 1.4 を使用。

4

1 に答える 1

5

あなたの質問で私が見たところによると、ブックマーク可能なページをレンダリングし、ユーザーにフィードバック メッセージを表示しようとしていますが (おそらく a でFeedbackPanel)、そのメッセージを URL の一部にしたくありません。

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

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

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

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

于 2012-04-17T11:42:55.920 に答える