我的Grails代码有一个搜索功能,在执行findAllBy查询后重定向到另一个控制器操作:
def results = Foo.findAllByBar(baz)
redirect(action: "result", params: [results: results])
findAllByBar按预期返回带有模型的ArrayList,但在重定向之后,接收操作获取String数组。更糟糕的是,当只有一个结果它甚至没有得到一个数组时,它只会得到一个字符串。
鉴于我必须在接收视图中迭代结果,在字符串上执行它将仔细地单独打印每个字母。我们都同意这可能不是理想的行为。
答案 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