在 Wicket ListView 中使用链接作为 LIstItem

Use Links as LIstItem in Wicket ListView

我正在尝试将 link 定义为 Wicket ListView 的 ListItem,如下所示:

<div wicket:id="outer" class="list-group">
    <a wicket:id="list_items" class="list-group-item">
        <span wicket:id="name"></span>
    </a>
</div>

每个项目周围不应有任何 div/span。预期输出为:

<div class="list-group">
    <a class="list-group-item" href="./foo/bar1">
        <span>bar1</span>
    </a>
    <a class="list-group-item" href="./foo/bar2">
        <span>bar2</span>
    </a>
    <a class="list-group-item" href="./foo/bar3">
        <span>bar3</span>
    </a>
</div>

这可以通过手动设置 href 来实现:

@Override
protected void populateItem(final ListItem<Course> item)
{
    String url=urlFor(FooPage.class,new PageParameters().add("name",item.getModelObject().getBar())).toString();
    item.add(new AttributeModifier("href",url));
    item.add(new Label("name", new PropertyModel(item.getModel(), "bar")));
}

一切都很好,我将继续使用此解决方案,但不知何故感觉不对。这是完成这项工作的最佳方式吗?

使用AttributeModifier修饰href-attribute确实感觉有点不对

如果您不希望在结果 HTML 中的每个列表元素周围有任何实际的 HTML 标签,您可以使用 <wicket:container> 标签。它不会呈现到最终页面中,除非您处于 运行 开发模式。

所以你的 HTML 可能看起来像这样

<div class="list-group">
    <wicket:container wicket:id="outer">
        <a wicket:id="link" class="list-group-item">
            <span wicket:id="name"></span>
        </a>
    </wicket:container>
</div>

你的 Java 代码是这样的

add(new ListView<Course>("list-group", list) {
    @Override
    protected void populateItem(ListItem<Course> item) {
        PageParameters parameters = new PageParameters().add("name", item.getModelObject().getBar());
        BookmarkablePageLink<Object> link = new BookmarkablePageLink<>("link", FooPage.class, parameters);
        item.add(link);
        link.add(new Label("name", new PropertyModel(item.getModel(), "bar")));
    }
});

或者不使用 <wicket:container> 标签,您也可以使用标准 <div> 标签并在 ListView#populateItem() 中设置 item.setRenderBodyOnly(true) 来隐藏它们,但我认为这有点不太优雅。

Tekki 的回答非常好,但这里还有一个技巧:

new RepeatingView("list_items") {
    protected void onPopulate() {
        removeAll();

        for (Course course : list) {
            PageParameters parameters = new PageParameters().add("name", course.getBar());
            BookmarkablePageLink<Object> link = new BookmarkablePageLink<>(newChildId(), FooPage.class, parameters);
            add(link);

            link.add(new Label("name", course.getBar()));    
        }
    }
}

所以基本上我们跳过中间项目组件的创建,直接使用链接作为转发器的子项。