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(']', '"]'))
}
其中僅當用戶不以任何這些字符的進入名現場工作。這看起來非常危險。