【问题标题】:Grails preserving flash message between redirectsGrails 在重定向之间保留 Flash 消息
【发布时间】:2016-04-29 11:52:57
【问题描述】:

在 grails 中,如果我这样做:

def someAction() {
 //.......

 flash.message = "some message"
 [:]
}

然后在 someAction.gsp 中,它会显示 flash 消息。

但如果是这样的话:

def someAction() {
 // ......
 flash.message = "some message"

 redirect uri: "${createLink(controller: 'someothercontroller', action: 'someotheraction')}"
}

那么在上述情况下,someotheraction.gsp 中将没有 flash.message。

我的问题是如何将 flash.message 从 someAction 传递到 someotheraction(可能在 someothercontroller 或同一个控制器中)。

我知道我可以执行params.flash = flash.message 之类的操作,在其他操作中使用此 params.flash 分配给那里的flash.message。然而,在这种方法中,我必须始终知道所有可能的重定向,而这些重定向可能并不总是发生。

那么有没有更好的,也许是“标准”的方式来保存 Flash 消息,直到最后一个重定向(最终呈现 gsp)?

【问题讨论】:

    标签: flash grails


    【解决方案1】:

    “有一个插件!”

    不幸的是,它是旧的,但它仍然可以工作,或者您可以浏览源代码以获取灵感。正如另一个答案所建议的那样,它基于将消息保存在会话中。

    One-Time Data plugin

    【讨论】:

      【解决方案2】:

      Grails 在重定向之间保留 flash,这里是一个示例:

      class ExampleController {
        def action1() {
          flash.message = 'test'
          redirect action: 'action2'
          // or redirect uri: "${createLink(controller: 'example', action: 'action2')}" or any other ways
          return
        }
      
        def action2() {
          render text: flash.message
        }
      }
      

      完美运行并在 action2 中呈现 'test'。也许你有几个重定向?在这种情况下,您应该在下次重定向之前重新定义您的 Flash 消息。

      UPD:

      使用会话(简单但不防弹):

      class ExampleController {
        def action1() {
          session.message = 'text'
          redirect action: 'action2'
        }
      
        def action2() {
          def msg = session?.message
          session.message = ''
      
          render text: msg
        }
      }
      

      对于来自一个用户 (session_id) 的多个同时请求的更好的方法,但也不理想:

      class ExampleController {
        def action1() {
          session.messages = (session.messages?:[]) + ['text']
          redirect action: 'action2'
        }
      
        def action2() {
          def msg = flash.messages?.get(0)
          flash.messages?.remove(0)
      
          render text: msg
        }
      }
      

      这只是一个想法,也许你会通过session找到更好的方法。

      【讨论】:

      • 是的,我收到了多个重定向。我正在寻找一种方法来实现我想要的,而不必重新定义 Flash 消息,因为所有重定向可能在所有情况下都不明显,其中一些甚至可能不受我们控制(例如,通过插件)
      • 在这种情况下,flash 不适合您。使用会话而不是闪存。但是不要记得在最后一个动作中阅读后将其擦除。此外,当具有单个 session_id 的用户同时打开多个窗口时,可能会出现错误消息的情况(但这不太可能)。
      • @rahulserver 你最终得到了什么样的解决方案?
      • 这正是我的问题,我重定向了两站。我选择了直接重定向,现在它可以工作了,谢谢:)
      【解决方案3】:

      试试这个。

      def someAction(){
          flash.message = "some message"
          redirect action: 'anotherAction'
      }
      
      def anotherAction() {
          flash.message = flash.message
      }
      

      【讨论】:

        【解决方案4】:

        我尝试了一段时间,但你不能这样做,也许你应该将消息保存在会话中,例如:

        session.message = "your message"
        

        然后,您将在需要的地方收到该消息。

        【讨论】:

        • 但是消息会保留在整个会话中。
        • 也许我不明白您需要什么,如果您想保留该消息,您应该将其保存在会话中,并在您知道不再需要它时将其删除。但是,如果您希望 flash.message 在使用一次重定向后立即可用,它可以正常工作,但以这种方式使用重定向:redirect (controller: 'someothercontroller', action: 'someotheraction')。我想知道为什么消极点,你提出问题的方式看起来你想通过许多重定向来保留信息,而不仅仅是一个。
        猜你喜欢
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-25
        • 2012-12-30
        • 1970-01-01
        • 2012-09-24
        相关资源
        最近更新 更多