Grails重定向中断参数类型

Grails重定向中断参数类型,grails,grails-controller,Grails,Grails Controller,My Grails代码有一个搜索函数,它在执行findAllBy查询后重定向到另一个控制器操作: def results = Foo.findAllByBar(baz) redirect(action: "result", params: [results: results]) 正如预期的那样,findAllByBar返回一个带有模型的ArrayList,但在重定向之后,接收操作将获得一个字符串数组。更糟糕的是,当只有一个结果时,它甚至没有得到一个数组,它只得到一个字符串 由于我必须在rece

My Grails代码有一个搜索函数,它在执行findAllBy查询后重定向到另一个控制器操作:

def results = Foo.findAllByBar(baz)
redirect(action: "result", params: [results: results])
正如预期的那样,findAllByBar返回一个带有模型的ArrayList,但在重定向之后,接收操作将获得一个字符串数组。更糟糕的是,当只有一个结果时,它甚至没有得到一个数组,它只得到一个字符串


由于我必须在receiving视图中遍历结果,因此在字符串上执行该操作将仔细地逐个打印每个字母。我们都同意,这可能不是理想的行为。

重定向会导致一个新的GET请求,其中包含querystring中的参数,例如/controller/result?foo=bar&baz=123-您不能将对象放在那里,因为它只是一个字符串

您可以将对象的ID放在参数中,并将其加载到
结果
操作中:

def action1 = {
   def results = Foo.findAllByBar(baz)
   redirect(action: "result", params: [resultIds: results.id.join(',')])
}

def result = {
   def resultIds = params.resultIds.split(',')*.toLong()
   def results = Foo.getAll(resultIds)
}
或者将它们放在闪存范围内:

def action1 = {
   flash.results = Foo.findAllByBar(baz)
   redirect(action: "result")
}

def result = {
   def results = flash.results
}

听起来您想使用chain方法而不是redirect方法。“链”允许您将模型作为类似于“渲染”的参数传递。 例如:

chain(action:'result',model:[results:results])
以下是进一步信息的链接:

这是有道理的-我假设同一控制器内的重定向是在同一请求内委派的。用于此目的。。。不知道
。使用它有什么坏处吗?与重定向相比?