3

我一直在更新我的一些控制器以使用命令对象,并开始制作 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]
    }
}

这一切都很好,我的控制器现在很好很简单。现在的问题是分页标签给我带来了问题。这是我最初认为可行的:

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

但是,分页标记仅查看附加到请求的大多数值的参数,而不是在 params 属性上传递的参数。我必须手动将这些变量作为上面的属性传递。

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

我是否不得不填充分页标记中的每个参数,还是我错过了另一种方式?

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

PS我正在使用Grails 2.3.6

4

1 回答 1

1

谢谢多勒里。该标签很容易实现,但我最终还是按原样使用了分页标签。通常只需要 3 个属性(total、max 和 offset),所以我认为引入新的自定义标签并不是一个足够大的问题。paginate 标记上的 params 属性实际上旨在传回请求参数以维护过滤器/排序/等的状态,因此我认为 Grails 不会使用它来填充标记中的其他属性是有道理的。

我最终确实调整了我的分页命令类,因为子类具有不必要地使请求参数混乱的集合和其他属性。这就是我最终做的。

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}" />
于 2014-06-05T04:29:49.923 回答