Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
grailsg:paginate-将搜索参数传递回控制器_Grails_Get_Pagination - Fatal编程技术网

grailsg:paginate-将搜索参数传递回控制器

grailsg:paginate-将搜索参数传递回控制器,grails,get,pagination,Grails,Get,Pagination,我建立了一个高级搜索选项,允许用户搜索大量不同的字段-总共38个可能的字段 提交初始搜索后,将显示10个结果,并在底部显示分页选项(使用grails的标签) 我想我这里有一些问题 1) 我需要使用g:paginate标记的params属性以某种方式将字段传递回控制器,但我并不真正想要创建一个包含40个左右参数的params映射 2) 我将搜索参数的映射从控制器传回页面(这样它们就可以有一个可撤销的参数列表,在没有撤销参数的情况下再次执行搜索)。我可以在params属性中将其传递回控制器,但它作为

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

提交初始搜索后,将显示10个结果,并在底部显示分页选项(使用grails的标签)

我想我这里有一些问题

1) 我需要使用
g:paginate
标记的
params
属性以某种方式将字段传递回控制器,但我并不真正想要创建一个包含40个左右参数的params映射

2) 我将搜索参数的映射从控制器传回页面(这样它们就可以有一个可撤销的参数列表,在没有撤销参数的情况下再次执行搜索)。我可以在
params
属性中将其传递回控制器,但它作为
字符串
而不是
映射
传递回控制器,因此我不知道如何遍历它(在遍历每个单独的字符后我意识到了这一点!)

3)
g:paginate
标记创建的链接的URL可能非常庞大,这取决于用户输入的搜索字段数量。URL是否有超过其最大数量的危险

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


任何帮助都会收到

我会将您的搜索参数放入
会话
。因此,您可以使用非常基本的grails
g.paginate
标记,而不使用它。每次用户更改搜索时,参数都应该得到更新。

您可以使用
pageScope.variables
将所有参数传递给操作,如

<g:paginate params="${pageScope.variables}" total=.../>

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}"/>
普惠制指数

        <div class="pagination">

            <g:paginate total="${personCount ?:0}" max="5" params="${params}" />
        </div>

在会话中保持页面状态,通常会产生比预期更多的副作用。比如什么?如果会话使用得当,则从未见过任何意外的副作用。当然,您可能会误用它,就像其他工具一样。对于这种特殊情况,在用户移出该页面后,您需要重置它。否则,当重新加载页面时,将具有以前的搜索参数。这正是在页面刷新或单击分页链接时应该发生的情况-搜索条件保持不变,但是分页选项可能会改变,因为在会话中保留搜索参数的另一个问题是,作为用户,您不能向某人发送指向某个复杂搜索的第37页的链接,并期望他们能够看到与您相同的结果。对于您的用例来说,这可能不是一个问题,但值得考虑。这可能与您当前的方法有所不同,您是否考虑过使用Ajax发送表单并更新结果表。看一看,然后。不过,它需要对您当前的体系结构进行一些更改。我一定会研究它。谢谢。你应该在答案中添加一些细节,而不仅仅是粘贴普通代码。你做了什么,为什么/如何解决这个问题?
        <div class="pagination">

            <g:paginate total="${personCount ?:0}" max="5" params="${params}" />
        </div>
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]
}