检票口 (1.6) 无状态表单重置分页



我已经尝试找到有关该问题的任何内容,但我想我要么不确定如何快速描述问题以找到解决方案,要么之前没有其他人遇到过我想不出的。也许我的想法也是错误的。

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

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

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

问题是:我该如何解决这个问题?我想即导航到第 2 页,然后暂时离开该页转到另一个内部页面。返回时,我想在第 2 页上,专注于我之前单击"详细信息"链接的记录。当我刚刚在新的浏览器选项卡中打开一个新页面时,也会发生这种情况。

谢谢!

下面是一些代码:

    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 页,然后单击详细信息并返回主页。

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

有关历史记录 API 的更多详细信息,请参阅使用新 URL 更新地址栏而不进行哈希处理或重新加载页面

我在NoWicket框架中通过引入模型感知页面缓存解决了这个问题,当页面模型中的哈希码/等于匹配时,该缓存会重用页面实例。您可以在 GitHub 存储库中看到该实现,尝试将 IPageFactory 包装器的实现作为起点,但它涉及的代码更多,只需查看代码、调试示例并导航代码以更好地理解它,以便将其应用于您的应用程序。通过在文档网站(您也可以在本地调试)中尝试此数据表示例,查看您的用例的实际应用: http://invesdwin.de/nowicket/ajaxdatatable

尝试更改分页索引,导航到其他页面,然后导航回数据表示例页面。您仍将看到您留在那里的分页索引。

谢谢你们的回复。我现在以另一种方式做到了。使用了此处的基本代码并以某种方式对其进行了修改。添加了一些不错的 css 属性修饰符来指示实际页面:

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)传递给数据提供程序,我只需要覆盖提供程序迭代器。它应该从我输入的页面开始。由于丑陋的生成的导航器URL(这对SEO非常不利),我现在有漂亮的URL可以独立工作,这在以前是不可能的。这也是我无法返回正确页面的原因。检票口无法查找导航器 URL。

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 不友好的 URL,这些 URL 也不兼容独立工作(直接输入生成的 URL),我现在拥有我期望的相同 URL,但添加了页面参数。

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

之前的网址是:本地主机:8080/游戏/4249/DE/厄运预购?0-1.ILink监听器-游戏价格-导航-2-页链接

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

这就是我如何通过一个很好的奖励来解决这个问题:用户和 SEO 友好的 URL。

最新更新