我正在尝试使用grails分页标记对列表进行分页。该列表由两个标准控制,一个'name'字符串和一个' inccirculation '布尔值。
这两个值作为searchCriteria映射传递给控制器的index方法:
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
def searchCriteria = params.searchCriteria?: [inCirculation:"on", name:""]
def criteria = new DetachedCriteria(Copy)
if(searchCriteria.inCirculation=="on") {
criteria = criteria.and {
eq("inCirculation", true)
}
}
if(!searchCriteria.name.isEmpty()) {
criteria = criteria.and {
game {
like("name", "%${searchCriteria.name}%")
}
}
}
def results = criteria.list(params)
respond results, model:[searchCriteria: searchCriteria, copyInstanceList: results, copyInstanceCount: results.totalCount]
}
searchCriteria映射对于确保对index方法的重复调用得到相同的结果集合至关重要。
显然,分页标签记住搜索条件是很重要的,这样当用户单击"下一个"链接时,执行完全相同的搜索,但显示第二页的结果。
我假设分页标记的params字段是我必须放置我的searchCriteria映射的地方,但是,我不知道如何。
我试过最明显的:
<g:paginate params="${[searchCriteria: searchCriteria]}" total="${copyInstanceCount ?: 0}" />
,但这似乎将searchCriteria映射转换为字符串:
| Error 2016-10-10 14:52:12,418 [http-bio-8080-exec-10] ERROR errors.GrailsExceptionResolver - MissingPropertyException occurred when processing request: [GET] /halcon-gaming-library/copy/index
No such property: inCirculation for class: java.lang.String. Stacktrace follows:
Message: No such property: inCirculation for class: java.lang.String
Line | Method
->> 14 | index in halcon.gaming.library.CopyController
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 198 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run in java.lang.Thread
我目前正在尝试将字符串重新构造映射,但代码变得复杂。这让我觉得我做错了什么。
带参数的grails分页标签的正确用法是什么?
偶然的,我想到的解决方案是:
if(searchCriteria instanceof String) {
println searchCriteria
searchCriteria = groovy.util.Eval.me(searchCriteria
.replaceAll('\{', '[')
.replaceAll('\}', ']')
.replaceAll('=', ':')
.replaceAll(':', ':"')
.replaceAll(',', '",')
.replaceAll(']', '"]'))
}
只有在用户没有在name字段中输入任何这些字符时才有效。这看起来超级危险。
Try
<g:paginate params="${params}" total="${copyInstanceCount ?: 0}" />