1

在我save的动作结束时,我重定向到这样的show动作:

redirect(action: "show", id: exampleInstance.id)

在我的show操作中,我希望能够检测是否有人通过 url 直接进入此操作,或者他们是否从另一个操作重定向到此处。我试过request.isRedirected()但它总是返回false

我如何检测我是否由于另一个动作的重定向而处于一个动作中?

4

3 回答 3

1

我猜你想显示一条确认消息。Grails 为这种用例提供​​了一个内置功能:

http://www.grails.org/doc/2.1.0/ref/Controllers/flash.html

看看这个例子:

class BookController {

    def save() { 
        flash.message = "Welcome!" 
        redirect(action: 'home') 
    }
}

在视图中,您可以打印或检查flash.message

于 2012-09-04T21:05:13.320 回答
0

在 Grails 源代码中看起来isRedirected()仅适用于save动作,因为它在redirect()方法逻辑中设置,因此不会在show动作中设置。

相反,这里有一些手动选项。一种是向flash对象添加一个标志,然后在重定向操作中对其进行测试。由于它在 flash 范围内,它将在show操作结束时被清除:

 def save() {
     // Do stuff
     flash.redirectFrom = "save"
     redirect(action:"show")
 }

 def show() {
     if (flash.redirectFrom) {
         // Respond to redirect
     }
     // Do other stuff
 }

另一种选择是发出chain()调用而不是 aredirect()并测试隐式chainModel对象。当从外部 URL 请求操作chainModel时将不存在:show

 def save() {
     // Do stuff
     chain(action:"show",model:[from:'show'])
 }

 def show() {
     if (chainModel) {
         // Respond to redirect
     }
     // Do other stuff
 }
于 2012-09-05T14:04:01.647 回答
0

理论上,isRedirect 检查请求属性。它相当于

import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes
if(request.getAttribute(GrailsApplicationAttributes.REDIRECT_ISSUED) != null){
    println "request was redirect"
}

直接尝试并告诉我会发生什么。

于 2012-09-04T20:16:22.613 回答