对于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....
似乎无法利用命名空间。我们必须硬编码。
任何人都有好主意吗?
答案 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