将数据从控制器传递到过滤器

时间:2009-06-26 15:33:27

标签: grails groovy metaprogramming

在Grails应用程序中,我正在寻找一些方法将数据从控制器操作传递到在操作之后运行的过滤器。我想的是:

class MyController {
    def myAction = {
        render(view:"myView", model:[key: "value"])

        passData {
            // Do some processing here
            name = "paolo"
            age = 38
        }
    }
}

public class MyFilters {

    def name
    def age

    def filters = {
        myFilter(controller: "*", action: "*") {
            after = { model ->
                // Do something with name and age
                return true
            }
        }
    }
}

最初的计划是在BootStrap.config的init()关闭中执行以下操作:

  • 使用元编程为所有控制器添加“passData(Closure pdClosure)”方法
  • 将pdClosure的委托设置为MyFilters,以便在此闭包中设置name和age属性时,可以在MyFilters实例上设置它们。

然而,我意识到这不会起作用,因为我没有明显的方法来访问(从BootStrap.init)将为特定控制器调用的MyFilters实例。

同样,似乎没有任何方法可以从过滤器中访问控制器实例。当然,我可以将所有数据填充到模型中,但我想知道是否有更优雅的方式在两者之间传递数据?

谢谢, 唐

2 个答案:

答案 0 :(得分:3)

在模型中传递数据似乎非常优雅,对我来说很容易。如果由于某种原因您不希望它可供视图使用,您甚至可以从过滤器中的模型中删除数据。

答案 1 :(得分:0)

如果在您的过滤器中您想要修改作为模型的数据,那么您的解决方案看起来很好。

但是,如果您只想将一些参数从控制器传递到过滤器,则请求属性应该更好(如果您只需要该数据用于请求范围)。这样您就不会将模型与某些请求参数混合在一起。