我正在尝试使用grails分页标记来分页列表。该列表由两个条件控制,一个“名称”字符串和一个“inCirculation” bool(boolean) 值。
这两个值作为searchCriteria映射传递到我的 Controller 的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
我目前正在尝试将字符串重新构成 map ,但是代码变得混乱。这向我表明我做错了事。
带有params的grails paginate标签的正确用法是什么样的?
顺便说一句,我想出的解决方案是:
if(searchCriteria instanceof String) {
println searchCriteria
searchCriteria = groovy.util.Eval.me(searchCriteria
.replaceAll('\\{', '[')
.replaceAll('\\}', ']')
.replaceAll('=', ':')
.replaceAll(':', ':"')
.replaceAll(',', '",')
.replaceAll(']', '"]'))
}
仅当用户未在名称字段中输入这些字符中的任何一个时,该方法才有效。这似乎很危险。
最佳答案
尝试
<g:paginate params="${params}" total="${copyInstanceCount ?: 0}" />
关于grails - 将参数传递到grails分页标签的预期方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39964328/