将参数传递给grails分页标记的预期方式是什么?



我正在尝试使用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}" />

最新更新