Grails重定向破坏参数类型

3

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

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

findAllByBar方法返回一个包含模型的ArrayList,这是预期的结果,但是在重定向后,接收的动作得到了一个String数组。更糟糕的是,当只有一个结果时,它甚至没有得到一个数组,它只得到了一个字符串。

考虑到我必须在接收视图中遍历结果,如果使用字符串来做这件事,它会逐个打印每个字母。我们都可以认为这可能不是理想的行为。

2个回答

8

重定向会在查询字符串中生成新的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
}

这是有道理的 - 我以为在同一个控制器内的重定向会在同一个请求中被委派。 - user915495
3
使用forward进行操作。 - Burt Beckwith

2

看起来你想使用链式方法而不是重定向方法。Chain 方法允许你像 render 一样传递模型作为参数。 一个例子是:

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

这里有一个进一步了解的链接: http://www.grails.org/doc/latest/ref/Controllers/chain.html


不错...不知道chain。使用它有什么缺点吗?与重定向相比呢? - andy mccullough

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接