Grails 控制器传递参数

Posted

技术标签:

【中文标题】Grails 控制器传递参数【英文标题】:Grails controllers pass parameters 【发布时间】:2011-09-02 23:02:46 【问题描述】:

我的控制器如下:

def participated = 
  def temp = ConferenceUser.get(params.temp)

  def prizes = Prizes.findAllByConferenceUser(temp) // find all rooms where current computer is
  def subms = Submissions.findAllByConferenceUser(temp) // find all rooms where current computer is

  [temp: temp, priz: prizes, subm: subms]

但不知何故,当我成功更新会议值时,我想回到初始页面(参与)但我不知道如何传回params.temp。 (如果我做一个简单的重定向,因为控制器期望 params.temp,它会给我一个错误,因为我无法使用空对象作为参数搜索奖品。所以,想象我的更新控制器如下:

def update = 
  def saveParamshere = params.temp
  ...
  ...
  (code here)
  ...
  ...

  redirect(action: "participated", params: [temp: saveParamshere])

此代码无效。怎样才能成功回到我的主页并传入params.temp

【问题讨论】:

【参考方案1】:

我认为问题可能是,您通过提交表单调用update 操作(我想)。也许您没有从该表单传递temp 值?您可以通过将temp 作为隐藏输入字段嵌入到表单中来做到这一点,或者通过表单标签上的param 属性将其应用于url。

使用隐藏字段可能是这样的(在您的视图文件中):

<g:form controller="somecontroller" action="update">
  (...)
  <g:hiddenField name="temp" value="$temp" />
  (...)
</g:form>

使用params属性:

<g:form controller="somecontroller" action="update" params="[temp : temp]">
  (...)
</g:form>

我没有测试任何这些,因此可能存在一些问题,尤其是在第二种方法中。

【讨论】:

【参考方案2】:

您可以将参数放在 flash 作用域中,该作用域适用于两个请求,或者将它们放在会话中并以这种方式检索它们。

这里是有关使用 flash 范围的 grails 文档的链接:

Grails - Controllers - Controller Scopes

【讨论】:

是的,flash 作用域适用于当前请求和下一个请求(即在重定向后仍然存在)。因此,在更新操作中执行 flash.temp = params.temp 应该意味着您可以在重定向操作中访问 flash.temp。 来自文档:“Flash 范围是 Rails 引入的一个概念。它是一个临时存储的属性,这些属性需要在这个请求和下一个请求中可用。之后属性被清除。这个对于在重定向之前直接设置消息很有用,例如“ 我的错,我忘记了它在重定向中仍然存在。

以上是关于Grails 控制器传递参数的主要内容,如果未能解决你的问题,请参考以下文章

grails g:link 传递参数

带有片段参数的 Grails render()

Grails 不会将变量传递给嵌套模板

GRAILS --- 如何在 g:link 中传递字符串文字到控制器方法

提交 Grails 表单都有哪些方便的技巧?

路由怎么传递参数给控制器