Grails 2.3.3命名空间控制器渲染视图

时间:2013-11-13 01:02:06

标签: grails grails-2.0 grails-controller

对于Grails 2.3.3,根据http://grails.org/doc/latest/guide/theWebLayer.html#namespacedControllers

,它允许在具有命名空间控制器的不同包中使用相同的名称控制器

所以我们有这样的包:

/admin/FooController
/public/FooController

为了保持一致,我们希望视图包像这样:

/views/admin/foo/...
/views/public/foo/...

但是,在FooController操作中,如果不对渲染方法进行硬编码。它会在

中找到视图
/views/foo/index....

似乎无法利用命名空间。我们必须硬编码。

任何人都有好主意吗?

2 个答案:

答案 0 :(得分:3)

你当然可以这样做。通过Sérgio Michels查看此帖子,了解如何使用afterInterceptor从不同目录呈现视图。我们的想法是在渲染之前替换默认视图。

所以你的控制器会是这样的:

package test.xpublic

class FooController {
    static namespace = 'public'
    def afterInterceptor = { model, modelAndView ->         
        if (modelAndView.viewName.contains('index')) {
            modelAndView.viewName = "/public/index"
        }
    }
    def index() { }
}

您可以发挥创意,并选择正确的视图,因为每个操作都会调用afterInterceptor

这将帮助您从目录(views / admin或views / public)呈现视图。但是,您还需要处理UrlMappings

class UrlMappings {
    static mappings = {
        "/foo/admin" {
            controller="foo"
             namespace = 'admin'
        }

        "/foo/public" {
            controller="foo"
            namespace = 'public'
        }
...
}

最后是你需要传递命名空间的链接。

<g:link controller='foo' namespace="admin" >Admin</g:link>
<g:link controller='foo' namespace="xpublic">Public</g:link>

提供了一个示例应用程序here

答案 1 :(得分:0)

至少使用Grails 3.2.0,这是开箱即用的。有关详细信息,请参阅http://docs.grails.org/latest/guide/theWebLayer.html#_selecting_views_for_namespaced_controllers