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