Wicket (1.6) 无状态表单重置分页

Wicket (1.6) stateless form resets paging

我已经尝试找到有关该问题的任何信息,但我想我要么不确定如何简短地描述问题以找到解决方案,要么没有其他人有过我无法想到的解决方案。也许我的想法也是错误的。

我有一个带有 ajax 支持面板的无状态 wicket 1.6 表单(带有输出 ID 的 WebMarkupContainer)。该面板包含一个带有分页导航器的数据视图。数据视图本身由 DataProvider 填充。

面板显示了数据库中的一些条目,下面是导航器。通过单击导航器上的任何页面,面板将刷新 (ajax) 并显示该页面的内容。浏览器不会重新呈现页面本身。

当我现在通过导航到另一个内部页面离开页面时(基本上以任何方式离开数据视图面板页面时)打开一个详细信息页面,然后 return 到那个数据视图-页面导航器被重置(因为我猜它是无状态的)。导航器不记得要显示哪个页面并再次从第一页的顶部开始。

问题是:我该如何解决这个问题?我愿意i.ex。导航到第 2 页,然后暂时离开该页面以访问另一个内部页面。当 returning 我想在第 2 页时,专注于我点击 link 到 "details" 之前的记录。当我在新的浏览器选项卡中打开新页面时也会发生这种情况。

谢谢!

这是一些代码:

    final WebMarkupContainer gamesPanel = new AjaxContainer("gamesPanel");
    final DataView<Game> dataView =
            new GameDataView("gameOverview", targetCurrencyModel, searchTextModel, gameFilterModel,
                    new GameDataProvider(searchTextModel, gameFilterModel, targetCurrencyModel));
    dataView.setItemsPerPage(ITEMS_PER_PAGE);
    gamesPanel.add(dataView);

    final XNPagingNavigator navigator = new XNPagingNavigator("navigator", dataView);
    navigator.setOutputMarkupId(true);
    add(navigator);

你们可以试试我的意思:我说的页面是http://www.xbox-now.de。只需导航到第 2 页,然后单击详细信息并 return 到主页。

我认为您可能会使用历史记录 API 在您单击导航栏时推送一个新状态。在状态的新 URL 中,您可以包含一个参数,该参数指示当前导航器页面的索引。 您可以自定义 AJAX link 以便在用户单击它时执行此操作。

有关历史的更多详细信息API,请参阅Updating address bar with new URL without hash or reloading the page

我在 NoWicket 框架中解决了这个问题,方法是引入模型感知页面缓存,当 hashcode/equals 在页面模型中匹配时,它会重用页面实例。您可以在 GitHub 仓库中看到实现,try this implementation of the IPageFactory wrapper as a starting point, but it is more code involved there, just check out the code, debug the example and navigate the code to understand it better in order to apply it to your application. See your use case in action by trying this data table example in the documentation website (which you can also debug locally): http://invesdwin.de/nowicket/ajaxdatatable

尝试更改分页索引,导航到其他页面并导航回数据 table 示例页面。您仍会看到您留在此处的分页索引。

谢谢大家的回复。我现在用另一种方式做到了。使用 here 中的基本代码并在某些方面进行了修改。添加了一些不错的 css AttributeModifiers 以指示实际页面:

item.add(new AttributeModifier("class", new PageLinkCssModel(pageable, pageIndex, "active")));

然后我修改了一些代码来添加或重置页面参数,它是 1) 只使用一次和 2) 保留在添加自己的页面参数之前存在的所有实际页面参数。所以我现在只是附加页码。这样我就可以保留我最初的挂载路径,如 www.foo.bar/path/path/path。完整的 URL 现在看起来像:www.foo.bar/path/path?page=123.

为了将我输入的页面(即 page=5)传递给数据提供者,我只需要重写提供者迭代器。它应该从我输入的页面开始。由于生成的导航器 URLs 丑陋(这对 SEO 极其不利),我现在拥有漂亮的 urls,它们可以独立工作,这在以前是不可能的。这也是我无法返回正确页面的原因。导航器 URL 无法通过 wicket 查找。

new DataView<GamePrice>("gamePriceOverview", new GameDetailDataProvider(gameId, targetRegion) {
                @Override
                public Iterator<GamePrice> iterator(final long first, final long count) {
                    return super.iterator(ITEMS_PER_PAGE * getCurrentPage(), count);
                }

getCurrentPage() 来自基本模板并获取输入的实际页码(如果输入):

public long getCurrentPage() {
    // -1 weil zero based
    return getRequest().getQueryParameters().getParameterValue("page").toString() != null
            ? (getRequest().getQueryParameters().getParameterValue("page").toLong() - 1)
            : 0;
}

因此,与其使用丑陋的 SEO 不友好的 URLs,它们也不兼容独立工作(直接输入生成的 url),我现在拥有相同的 URL 我希望添加了页面参数。

URL 现在看起来像: http://localhost:8080/game/4249/de/doom-preorder?page=2

URL 之前是: localhost:8080/game/4249/DE/doom-preorder?0-1.ILinkListener-gamePrices-navigator-navigation-2-pageLink

如果我现在从详细信息页面返回到活动的主索引 "Bookmarkable-Navigator",我会正确地返回到我离开它的页面和位置(因为可添加书签的页面链接)。

这就是我如何解决这个问题并获得了一个不错的奖励:用户友好和 SEO 友好 URLs。