Grails 重定向中断参数类型

Posted

技术标签:

【中文标题】Grails 重定向中断参数类型【英文标题】:Grails redirect breaks params types 【发布时间】:2011-11-05 02:28:48 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

重定向会产生一个带有查询字符串中参数的新 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

【讨论】:

这是有道理的——我假设同一个控制器内的重定向是在同一个请求中委托的。 为此使用forward【参考方案2】:

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

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

这里是更多信息的链接: http://www.grails.org/doc/latest/ref/Controllers/chain.html

【讨论】:

不错...不知道chain。使用它有什么缺点吗?与重定向?

以上是关于Grails 重定向中断参数类型的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2(授权代码授予类型)的重定向 URI 中是不是应该存在动态查询参数

Play Framework - 使用参数重定向

.NET Core 重定向中无法识别的参数类型 REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR

flask第十四篇——重定向

springMVC数据相关

微信小程序-关于重定向问题