Grails g:paginate - 将搜索参数传递回Controller

时间:2014-02-28 11:29:52

标签: grails get pagination

我构建了一个高级搜索选项,允许用户搜索多个不同的字段 - 总共38个可能的字段。

提交初始搜索后,将显示10个结果,底部带有分页选项(使用grails'<g:paginate>标记)。

我想我在这里遇到了一些问题。

1)我需要以某种方式使用params标签的g:paginate属性将字段传回控制器,但我真的不想创建40个参数的参数。

2)我从Controller传回一个搜索参数的页面(这样他们可以有一个可忽略的参数列表,在没有dismissed参数的情况下再次执行搜索)。我可以在params属性中将其传回,但是它作为String而不是map传回控制器,所以我不知道如何迭代它(我意识到在迭代完每个单独的角色之后!)。

3)g:paginate标记创建的链接的网址可能很大,具体取决于用户输入的搜索字段数量。 URL是否有超过最大金额的危险?

我正在考虑改变内置的grails paginate功能,并创建一个我可以POST的表单。我不确定这是否是最佳方式,而且我可能会错过一些更好的替代方法。

任何帮助都很受欢迎!

4 个答案:

答案 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 } ]