我有一个gsp文件调用这样的方法:
<g:link id="${child.id}" action="callChildProfile" controller="profile">${child.firstname}</g:link>
调用此方法
def callChildProfile(Long id){
childInstance = Child.get(id)
System.out.println(childInstance.firstname + " child instance")
redirect(action: "index")
}
此方法将子实例设置为名为子实例的公共变量,但是当重定向发生时,该变量将被重置。 我重定向的原因是因为我想从这个控制器加载索引页。
索引如下:
def index() {
def messages = currentUserTimeline()
[profileMessages: messages]
System.out.println(childInstance + " child here")
[childInstance : childInstance]
}
答案 0 :(得分:2)
默认情况下,控制器是原型作用域,这意味着在调用ProfileController
的请求和调用callChildProfile
的请求之间使用的index
实例会有所不同。因此,对象级别childInstance
变量在请求之间不可用。
要在Child
电话中使用index
个实例,请查看chain方法:
callChildProfile(Long id){
// do usual stuff
chain(action:"index", model:[childInstance:childInstance])
}
def index() {
// do other stuff
[otherModelVar:"Some string"]
}
从Map
返回index
后,系统会自动添加链式调用模型,因此childInstance
中的callChildProfile
将可用于gsp。< / p>
答案 1 :(得分:1)
控制器方法(动作)中的变量具有局部范围,因此,只能在该方法中使用。您应该从新实例传递id并使用该id来检索对象。
redirect action: "index", id: childInstance.id
和索引可能是
def index(Long id){
childInstance = Child.get(id)
然后你可以得出结论,你不需要callChildProfile方法
或者你可以使用params
def index(){
childInstance = Child.get(params.id)
if(childInstance){
doSomething()
}
else{
createOrGetOrDoSomethingElse()
}
}