link 的反馈面板

FeedbackPanel with link

是否有任何解决方案可以构建包含 Link 内部消息的反馈面板?我尝试使用这个:

            StringBuilder stringBuilder= new StringBuilder(512);
            stringBuilder.append("<a href=\"");
            stringBuilder.append(Utils.getAbsoluteUrl(EditBookingSourcePage.class, new PageParameters())+"");
            stringBuilder.append("\">Clicca Qui!</a>");

            feedbackErrorPanel.info(stringBuilder);

public static <C extends Page> String getAbsoluteUrl(final Class<C> pageClass, final PageParameters parameters) {

    CharSequence resetUrl = RequestCycle.get().urlFor(pageClass, parameters);
    String abs = RequestUtils.toAbsolutePath("/", resetUrl.toString());
    final Url url = Url.parse(abs);
    return RequestCycle.get().getUrlRenderer().renderFullUrl(url);
}

但不起作用。

您需要致电 feedbackPanel.setEscapeModelStrings(false)。 没有这个 Wicket 将转义所有 HTML 个字符以防止 XSS 攻击。

正如@martin-g 首先提到的,您应该转义 html 标签。 feedbackPanel.setEscapeModelStrings(false)

正如你所说,你做到了。我相信 url 构建问题。因此,无论您在此基础上做了什么,请尝试下面的步骤。我尝试了以下对我有用的解决方案。

     //since you are not passing any parameter we can send null
    String absoluteUrl = RequestCycle.get().getUrlRenderer().renderFullUrl(
                            Url.parse(urlFor(EditBookingSourcePage.class, null).toString())); 


StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("<a href=");
                stringBuilder.append(absoluteUrl);
                stringBuilder.append("\">Clicca Qui!</a>");
          feedbackErrorPanel.info(stringBuilder);

在 WicketApplication 页面中

mountPage("setting/booking-source", EditBookingSourcePage.class);

另一种方法是:

1,扩展org.apache.wicket.markup.html.panel.FeedbackPanel

2、扩展org.apache.wicket.feedback.FeedbackMessage并存储数据

3、使用自己的标记、模型对象创建 MyMessagePanel

4、重写扩展FeedbackPanel中的newMessageDisplayComponent方法

@Override
    protected Component newMessageDisplayComponent(String id, FeedbackMessage message) {
        //message with its own markup
        if (message.getClass().equals(MyMessage.class)) {
            MyMessage msg = (MyMessage) message;
            return new MyMessagePanel(id, Model.of(new MyMessagePanelModelObject(msg.getModelObject()))); //my message markup
        }

        return super.newMessageDisplayComponent(id, message); //other messages
    }