Grails重定向打破params类型

时间:2011-08-27 13:29:08

标签: grails grails-controller

我的Grails代码有一个搜索功能,在执行findAllBy查询后重定向到另一个控制器操作:

def results = Foo.findAllByBar(baz)
redirect(action: "result", params: [results: results])

findAllByBar按预期返回带有模型的ArrayList,但在重定向之后,接收操作获取String数组。更糟糕的是,当只有一个结果它甚至没有得到一个数组时,它只会得到一个字符串。

鉴于我必须在接收视图中迭代结果,在字符串上执行它将仔细地单独打印每个字母。我们都同意这可能不是理想的行为。

2 个答案:

答案 0 :(得分:7)

重定向会产生一个新的GET请求,其中包含查询字符串中的参数,例如: / controller / result?foo = bar& baz = 123 - 你不能把对象放在那里,因为它只是一个字符串。

你可以将对象的id放在参数中并在result动作中加载它们:

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)
}

或将它们放在Flash范围内:

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

def result = {
   def results = flash.results
}

答案 1 :(得分:2)

听起来你想使用链式方法而不是重定向方法。 Chain允许您将模型作为类似于render的参数传递。 一个例子是:

chain(action:'result',model:[results:results])

以下是有关进一步信息的链接: http://www.grails.org/doc/latest/ref/Controllers/chain.html