2016-10-10 62 views
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(']', '"]')) 
    } 

其中仅当用户不以任何这些字符的进入名现场工作。这看起来非常危险。

回答

0

尝试

<g:paginate params="${params}" total="${copyInstanceCount ?: 0}" />