Grails命令对象和分页

时间:2014-06-03 19:56:13

标签: grails pagination command-objects

我一直在更新我的一些控制器以使用命令对象,并开始为其他命令对象制作PaginateCommand以进行扩展。

class PaginateCommand {
    String sort
    String order
    Integer max
    Integer maxsteps
    Integer offset
    Integer total
}

子命令类

@Validateable
class MyOtherCommand extends PaginateCommand {
    ...    
}

控制器

class SomeController {

    def someService

    def index(MyOtherCommand cmd) {
        someService.loadSomeList(cmd)
        return [cmd: cmd]
    }
}

这一切都很棒,而且我的控制器现在很简单。现在的问题是paginate标签给我带来了问题。这是我最初认为会起作用的:

<g:paginate total="${cmd.total}" params="${cmd.properties}" />

但是,paginate标记只查看附加到大多数值的请求的参数,而不是在params属性上传递的参数。我必须手动将这些变量传递给像total这样的属性。

当绑定到命令对象时,所有分页变量似乎都从请求参数中删除(我假设)。我想将这些变量保存在命令对象中,因此我不必将请求参数传递给我的服务。让控制器在渲染之前重新填充参数似乎也适得其反。

我是否不得不填充paginate标签中的每个参数或者是否有其他方式我缺少?

<g:paginate total="${cmd.total}" offset="${cmd.offset}" max="${cmd.max}".... /> 

P.S。我正在使用Grails 2.3.6

1 个答案:

答案 0 :(得分:1)

谢谢doelleri。标签很容易实现,但最终我按原样使用了paginate标签。通常只需要3个属性(总数,最大值和偏移量),因此我认为引入新的自定义标记不是一个足够大的问题。 paginate标签上的params属性实际上是为了传递返回请求参数来维护过滤器/排序/等的状态,所以我认为Grails不会使用它来填充标签中的其他属性。

我最终调整了我的paginate命令类,因为子类具有集合和其他属性,这些属性不必要地混杂了请求参数。这就是我最终要做的事情。

abstract class PaginateCommand {
    String sort
    String order
    Integer max
    Integer maxsteps
    Integer offset
    Integer total

    // Properties needed to maintain pagination state
    abstract Map getFilterParams();

    public Map getPaginateParams() {
        return [sort:sort, order:order] << filterParams
    }
}

子命令

@Validateable
class MyOtherCommand extends PaginateCommand {    
    String filter1
    String filter2
    List data

    public MyOtherCommand() {
        max = 50
        sort = "id"
        order = "desc"
    }

    Map getFilterParams() {
        [filter1: filter1, filter2: filter2]
    }
    ...
}

控制器

def index(MyOtherCommand cmd) {
    someService.loadData(cmd)
    return [cmd: cmd]
}

在gsp中

<g:paginate total="${cmd.total}" max="${cmd.max}" maxsteps="${cmd.maxsteps}" offset="${cmd.offset}" params="${cmd.paginateParams}" />