grailsg:paginate-将搜索参数传递回控制器
我建立了一个高级搜索选项,允许用户搜索大量不同的字段-总共38个可能的字段 提交初始搜索后,将显示10个结果,并在底部显示分页选项(使用grails的标签) 我想我这里有一些问题 1) 我需要使用grailsg:paginate-将搜索参数传递回控制器,grails,get,pagination,Grails,Get,Pagination,我建立了一个高级搜索选项,允许用户搜索大量不同的字段-总共38个可能的字段 提交初始搜索后,将显示10个结果,并在底部显示分页选项(使用grails的标签) 我想我这里有一些问题 1) 我需要使用g:paginate标记的params属性以某种方式将字段传递回控制器,但我并不真正想要创建一个包含40个左右参数的params映射 2) 我将搜索参数的映射从控制器传回页面(这样它们就可以有一个可撤销的参数列表,在没有撤销参数的情况下再次执行搜索)。我可以在params属性中将其传递回控制器,但它作为
g:paginate
标记的params
属性以某种方式将字段传递回控制器,但我并不真正想要创建一个包含40个左右参数的params映射
2) 我将搜索参数的映射从控制器传回页面(这样它们就可以有一个可撤销的参数列表,在没有撤销参数的情况下再次执行搜索)。我可以在params
属性中将其传递回控制器,但它作为字符串
而不是映射
传递回控制器,因此我不知道如何遍历它(在遍历每个单独的字符后我意识到了这一点!)
3) g:paginate
标记创建的链接的URL可能非常庞大,这取决于用户输入的搜索字段数量。URL是否有超过其最大数量的危险
我正在考虑改变内置的grails paginate功能,并创建一个可以发布的表单。我不确定这是否是最好的方法,但我可能错过了一些更好的替代方法
任何帮助都会收到 我会将您的搜索参数放入
会话
。因此,您可以使用非常基本的grailsg.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]
}