在我save
的动作结束时,我重定向到这样的show
动作:
redirect(action: "show", id: exampleInstance.id)
在我的show
操作中,我希望能够检测是否有人通过 url 直接进入此操作,或者他们是否从另一个操作重定向到此处。我试过request.isRedirected()
但它总是返回false
。
我如何检测我是否由于另一个动作的重定向而处于一个动作中?
在我save
的动作结束时,我重定向到这样的show
动作:
redirect(action: "show", id: exampleInstance.id)
在我的show
操作中,我希望能够检测是否有人通过 url 直接进入此操作,或者他们是否从另一个操作重定向到此处。我试过request.isRedirected()
但它总是返回false
。
我如何检测我是否由于另一个动作的重定向而处于一个动作中?
我猜你想显示一条确认消息。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
。
在 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
}
理论上,isRedirect 检查请求属性。它相当于
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes
if(request.getAttribute(GrailsApplicationAttributes.REDIRECT_ISSUED) != null){
println "request was redirect"
}
直接尝试并告诉我会发生什么。