2016-10-10 34 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}" /> 
相關問題