テキストとリンク(別のフラグメント内)を含む別のフラグメントで構成された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
ありがとう