我构建了一个高级搜索选项,允许用户搜索多个不同的字段 - 总共38个可能的字段。
提交初始搜索后,将显示10个结果,底部带有分页选项(使用grails'<g:paginate>
标记)。
我想我在这里遇到了一些问题。
1)我需要以某种方式使用params
标签的g:paginate
属性将字段传回控制器,但我真的不想创建40个参数的参数。
2)我从Controller传回一个搜索参数的页面(这样他们可以有一个可忽略的参数列表,在没有dismissed参数的情况下再次执行搜索)。我可以在params
属性中将其传回,但是它作为String
而不是map
传回控制器,所以我不知道如何迭代它(我意识到在迭代完每个单独的角色之后!)。
3)g:paginate
标记创建的链接的网址可能很大,具体取决于用户输入的搜索字段数量。 URL是否有超过最大金额的危险?
我正在考虑改变内置的grails paginate功能,并创建一个我可以POST的表单。我不确定这是否是最佳方式,而且我可能会错过一些更好的替代方法。
任何帮助都很受欢迎!
答案 0 :(得分:8)
您可以使用pageScope.variables
<g:paginate params="${pageScope.variables}" total=.../>
答案 1 :(得分:1)
我会将您的搜索参数放入session
。因此,您可以使用非常基本的grails g.paginate
标签来污染它。每次用户更改他的搜索时,参数都应该更新。
答案 2 :(得分:1)
index.gsp中
<div class="pagination">
<g:paginate total="${personCount ?:0}" max="5" params="${params}" />
</div>
Controller.groovy
def index(Integer max)
{
def c=Person.createCriteria()
def results
int count
params.max = Math.min(max ?: 5, 100)
if(params.name != null)
{
params.max = 4
if(!params.offset)
{
params.offset = 0;
}
count = Person.countByNameLike("%"+params.name+"%")
results=c.list{
like("name","%"+params.name+"%")
maxResults(params.max)
firstResult(params.getInt("offset"))
}
}
else
{
results = Person.list(params)
count = Person.count()
}
respond results, model:[personCount: count]
}
答案 3 :(得分:0)
1和2)我找到的最佳解决方案:
采取行动:
def list() {
... //use params to filter you query and drop results to resultList of type PagedResultList
return [resultList: resultList, resultTotal: resultList.getTotalCount(), filterParams: params]
}
视图:
<g:paginate total="${resultTotal}" action="list" params="${filterParams}"/>
查看完整的example。
3)url(和get参数)限制大小为2000(see why)。如果这对您来说是一个问题,您最好切换到ajax解决方案或最小化网址大小仅过滤填充的参数。您可以完成替换此行:
return [resultList: resultList, resultTotal: resultList.getTotalCount(), filterParams: params.findAll{ it.value } ]