0
我想使用grails分页标签来分页列表。这个列表由两个标准决定,一个'name'字符串和一个'inCirculation'布尔值。将参数传递给grails分页标签的方法是什么?
这两个值传递给我的控制器的索引方法作为searchCriteria地图:
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地图是在确保重复调用索引方法得到的结果相同集合的关键。
显然,分页标记记住搜索条件非常重要,这样当用户点击“下一个”链接时,将执行完全相同的搜索,但会显示第二页结果。
我假设pagination标签的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(']', '"]'))
}
其中仅当用户不以任何这些字符的进入名现场工作。这看起来非常危险。