1

根据 Grails 用户指南中的内容,根据内容协商发送不同内容格式的推荐方法withFormat是使用块:

import grails.converters.XML
class BookController {

    def list() {
        def books = Book.list()
        withFormat {
            html bookList: books
            js { render "alert('hello')" }
            xml { render books as XML }
        }
    }
}

但是,我希望我的所有控制器方法的响应都可以做到这一点。withFormat有没有比在每个内容返回操作结束时简单地复制粘贴块更好的方法来获得这种行为?

4

2 回答 2

1

首先出现在我脑海中的两件事是拦截器和过滤器:

http://grails.org/doc/1.3.7/ref/Controllers/afterInterceptor.html

http://grails.org/doc/latest/guide/6.%20The%20Web%20Layer.html#6.6过滤器

拦截器不起作用,因为您不能使用 withFormat。太糟糕了,因为这是一个更全球化的。

过滤器将在每个控制器的控制器上工作,但至少你会在那个级别上最小化你的重复。

def afterInterceptor = {model, modelAndView ->
    withFormat {
        html { model }
        js { render "alert('hello')" }
        xml { render model as XML }
    }
}

这在我的测试项目中对我有用。我尝试将这个闭包放入它自己的类中并在类中混合,这样你就可以做一个更全局的解决方案......虽然没有骰子。

也许你所有的 afterInterseptors 都将模型 modelAndView 传递给一个公共类?这似乎有效:)(在回答时努力回答)

@Mixin(AfterInterceptorWithFormat)
class FirstController {

    def action1 = {}
    def action2 = {}

    def afterInterceptor = {model, modelAndView ->
        performAfterInterceptor(model, modelAndView)
    }
}

class AfterInterceptorWithFormat {

    def performAfterInterceptor(model, modelAndView) {
        withFormat {
            html { model }
            js { render "alert('hello')" }
            xml { render model as XML }
        }
    }
}

试一试,让我知道你的想法。

于 2011-12-15T17:36:54.543 回答
0

我最终做的是简单地调整默认的 CRUD 模板以withFormat在每个方法的末尾添加块。

我意识到我真正想要的只是内容协商的 CRUD,因此我只需要将代码放入模板中即可。

我的应用程序的非 crud 部分的其余控制器不需要 no-html 输出,因此我不需要对除 crud 控制器之外的任何内容进行内容协商。

于 2012-01-30T14:24:32.747 回答