Grails中的分页问题

时间:2015-11-11 17:20:04

标签: grails pagination

我希望在分页中显示特定类别下的所有游戏(10 /页) 这是我的控制器

def listGame(){
    def category = GameCategory.list()
    def platform = Platform.list()
    def currentCategory = params.categoryName
    def myCategory=GameCategory.findByCategoryName(currentCategory)
    def games = myCategory.games

    [currentCategory:currentCategory, category:category, games:games,  platforms:platform, gameCount:Game.count(), chosenPlatform:params.platform] 
}

这是我视图中的分页代码

<g:each in="${games}" status="i" var="game">
    ${game.gameTitle}
</g:each>
<div class="pagination">
            <g:paginate action="listGame" total="${gameCount}" />
</div>

当我在当前类别中有9个游戏时,第12页显示其中不应该

当我在当前类别中有11个游戏时,所有11个游戏都显示在第1页中,单击第2页将导致此错误 enter image description here

2 个答案:

答案 0 :(得分:1)

有几件事需要解决。

  1. 确保categoryName未以null进入控制器。
  2. 利用分页器提供的maxoffset参数来选择合适的Game
  3. 类别名称

    因为分页器正在创建调用控制器的URL,并且您的控制器需要类别名称,所以分页器必须将类别名称添加到它调用控制器操作的参数。您可以使用代码params属性

    来实现此目的
    <g:paginate action="listGame" total="${gameCount}" params="${[categoryName: currentCategory]}"/>
    

    Max&amp;偏移

    控制器需要使用maxoffset参数来了解要从数据库中检索并在视图中呈现的Game的哪个子集。但是,在某些情况下,例如访问网址http://blah/someController/listGame时,不会有maxoffset参数。这是您的控制器操作必须能够处理的事情。它是这样的:

    def max = params.max ?: 10
    def offset = params.offset ?: 0
    

    因此,如果maxoffset参数可用,则会使用它们。否则他们将使用默认值。

    最后,您需要使用这些参数来选择Game。为此,您可以使用 where 查询:

    def games = Game.where {
        categories.categoryName == currentCategory
    }.list(max: max, offset: offset)
    

    有关返回的games对象的一些有趣内容:它就像一个列表,但它实际上是grails.gorm.PagedResultList。这是一件好事,因为它包含结果中的记录数(忽略最大值和偏移量)。换句话说,它是您的新gameCount

    您可以在Grails文档中阅读有关where查询的更多信息。我还有一系列articles,它们更详细地介绍了where,criteria和HQL查询。

    总而言之,listGame()看起来像这样:

    def listGame(){
        def category = GameCategory.list()
        def platform = Platform.list()
        def currentCategory = params.categoryName
        def max = params.max ?: 10
        def offset = params.offset ?: 0
        def games = Game.where {
            categories.categoryName == currentCategory
        }.list(max: max, offset: offset)
    
        [currentCategory:currentCategory, category:category, games:games,  platforms:platform, gameCount:games.totalCount, chosenPlatform:params.platform] 
    }
    

答案 1 :(得分:0)

看起来你还没完成你的作业。请仔细阅读grails doc和其他教程,了解分页的工作原理。

只是给你一个提示。你在这里犯了两件事。

  1. 您没有在控制器
  2. 的第一个位置获得分页列表
  3. 您没有从分页链接将所有必需的数据发送回控制器。这就是你收到错误的原因!