テキストとリンク(別のフラグメント内)を含む別のフラグメントで構成されたListViewがあります。リストビューモデルの状態に応じて、リンクが表示されます。
簡単にするために、リストビューモデルのブールフィールドに応じてリンクが表示されているとします。trueの場合は表示され、そうでない場合は非表示になります。
最初はリンクが表示され、リンクの場所をコピーし(暗号化)、モデルが変更されるのを待ち(ブール値からfalseに)、ページを更新するとリンクがなくなります。(正しい!)
以前にコピーしたURLをブラウザに戻そうとすると、このリンクのリスナーが見つからなかったことを通知するWicketRuntimeExceptionが表示されます。
より完全にするために、リンクはフラグメント内にあります。
<wicket:fragment wicket:id="reservationRatingFragment">
    <li>
        <div>
            <img src="/img/good.png" />
        </div>
        <p>
            <a wicket:id="ratingGoodLink" href="#"> <wicket:message
                    key="messaging.reservation.rating.good" />
            </a>
        </p>
    </li>
</wicket:fragment>
そして、私が目に見えないと言うとき、私はフラグメントのマークアップコンテナを.setVisible(false);として設定したことを意味します。
なぜこうなった?表示されなくなったリンクを思い出した場合、フレームワークはそれをスキップして、現在表示しているページを更新する(またはベースページにリダイレクトする)必要があると思います。
たとえば、リンクをコピーしてBasePageを変更した場合(たとえば、ホームページに移動した場合)、コピーしたURLを呼び出したときに例外が発生します。
編集:
最初のフラグメント:
WebMarkupContainer msgRatingContainer = new WebMarkupContainer("messageRatingContainer") {
            private static final long serialVersionUID = 1L;
            @Override
            public void onConfigure() {
                setVisible(message.getType() == MessageType.RATING);
            }
        };
if (msgRatingContainer.isVisible()) {
            if (message.getType() == MessageType.RATING) {
                msgRatingContainer.add(new ReservationRatingFragment("messageRatingSection",
                        "reservationRatingFragment", this, item, message));
}
ネストされたフラグメント(ReservationRatingFragment):
public ReservationRatingFragment(String id, String markupId,MarkupContainer markupContainer, Item item, Message msg) {
        super(id, markupId, markupContainer, new Model<Message>(msg));
        /* Avoid render container */
        setRenderBodyOnly(true);
        /* Load button components */
        Link<Void> ratingGoodLink = new Link<Void>("ratingGoodLink"){
            private static final long serialVersionUID = 1L;
            @Override
            public void onClick() {
                processRating(ReservationEvaluationResult.GOOD);
            }   
        };
        add(ratingGoodLink);
        Link<Void> ratingBadLink = new Link<Void>("ratingBadLink"){
            private static final long serialVersionUID = 1L;
            @Override
            public void onClick() {
                processRating(ReservationEvaluationResult.BAD);
            }   
        };
        add(ratingBadLink);
    }
両方のフラグメントのマークアップ:
<wicket:fragment wicket:id="messageFragment">
    Some content...
    <!-- Here goes my fragment with link -->
    <ul wicket:id="messageRatingContainer">
        <div wicket:id="messageRatingSection"></div>
    </ul>
    <wicket:fragment wicket:id="reservationRatingFragment">
        <li><div>
                <img src="/img/messaging/good.png" />
            </div>
            <p>
                <a wicket:id="ratingGoodLink" href="#"> <wicket:message
                        key="messaging.reservation.rating.good" />
                </a>
            </p></li>
        <li><div>
                <img src="/img/messaging/bad.png" />
            </div>
            <p>
                <a wicket:id="ratingBadLink" href="#"> <wicket:message
                        key="messaging.reservation.rating.bad" />
                </a>
            </p></li>
    </wicket:fragment>
</wicket:fragment>
編集済み:processRatingは、コントローラー(バックエンドでの変更を処理する)への呼び出しを実行するだけです。コントローラでリプレイアタックをチェックし(このアクションがすでに実行されている場合)、その場合、ユーザーを警告ページに導くランタイム例外をスローします(このメッセージはすでに評価されています)。実際には、この場合、リンクが利用できないため、コントローラーを呼び出さず、リンクが表示されないため、InvalidUrlExceptionがスローされるため、この時点には到達しません。
ウィケットバージョン:1.4.19
ありがとう