2

对于 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....

似乎它不能利用命名空间。我们必须硬编码。

有人对此有好主意吗?

4

2 回答 2

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>

此处提供了一个示例应用程序

于 2013-11-13T03:32:00.950 回答
0

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

于 2016-10-15T12:47:02.977 回答