【发布时间】:2012-10-19 00:27:01
【问题描述】:
我有一个由不同片段组成的 ListView,其中包含文本和链接(在另一个片段内)。根据列表视图模型的状态,链接是否可见。
为简单起见,假设链接是否可见,具体取决于列表视图模型的布尔字段,如果为真则可见,否则不可见。
最初链接是可见的,我复制链接位置(加密),等待模型更改(即布尔值变为 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
谢谢
【问题讨论】:
-
除了 html 标记之外,查看您的 Java 代码也会有所帮助。你在使用 BookmarkablePageLink 吗?
-
我添加了更多代码,我不使用任何 BookmarkablePageLink,只使用 org.apache.wicket.markup.html.link.Link
标签: java exception hyperlink wicket replay