2011-06-14 44 views
2

我想知道是否可以使用g:include来仅包含给定页面的正文内容。Grails g:include可以做吗?

说我有一个主要的页面布局如下:

<html> 
    <head> 
    <title>My start page</title> 
    <g:layoutHead> 
    </head> 
    <body> 
    <g:layoutBody> 
    </body> 
</html> 

然后主网页(index.gsp中)

<html> 
    <head> 
    <!-- main layout reference --> 
    <meta name="layout" content="main"/> 
    </head> 
    <body> 
    THIS IS MY INDEX BODY CONTENT WITH AN INCLUDE 
    <g:include controller="book" action="list"/> 
    <g:link controller="book" action="list">See the full list!</g:link> 
    </body> 
</html> 

最后书/列表页面

<html> 
    <head> 
    <!-- main layout reference --> 
    <meta name="layout" content="main"/> 
    </head> 
    <body> 
    <table> 
    <g:each in="${books}"> 
     <tr> 
     <td>${it.author}</td> 
     <td>${it.title}</td> 
     <td>${it.price}</td> 
     </tr> 
    </g:each> 
    </table> 
    </body> 
</html> 

所以我想实现的是,主页面(index.gsp)只包括book/list页面中定义的表格。但是,当我尝试这个包括整个html定义(<html>标签和所有)。

是否有可能以某种方式做到这一点?我尝试过像<g:include controller="book" action="list" view="someView.gsp"/>之类的东西,但这不起作用。我真的想要避免必须向“索引控制器”添加书目列表逻辑,我想重新使用现有的控制器。

我不能成为第一个有这种用例的人,你们提出了什么解决方案?

回答

6

您可以使用applyLayout标记。简单地只创建一个empty.gsp布局:

<g:layoutBody/> 

然后用applyLayout装饰你include标签:

<g:applyLayout name="empty"> 
    <g:include controller="book" action="list"/> 
</g:applyLayout> 

有关进一步参考在Grails guide的条目。

+0

这正是我正在寻找的,谢谢一大堆! – netbrain 2011-06-14 18:35:55

+0

这是否仍然是正确的方法。 – Nix 2013-02-26 14:37:24

0

这是恕我直言,不可能。一个想法是创建一个基于g:include的自定义标签,通过例如剥去部分代码。一个xpath表达式。我不知道这已经存在。

另一种方法是,使用g:renderindex.gsp模板书的list.gsp的主体部分重构为一个template和参考。但这意味着数据模型必须在index.gsp上下文中可用,因为g:render不会调用控制器。

备注:使用g:include时,最好使用springcache plugin进行页面片段缓存。

+0

春季缓存插件也是为什么我要这样工作的原因之一的第一个目的。 – netbrain 2011-06-14 08:53:17

-1

是的,但你需要你需要一个更多的水平。看看Grails模板。从本质上讲,你就会有一个模板:含_books.gsp:

<table> 
    <g:each in="${books}"> 
     <tr> 
     <td>${it.author}</td> 
     <td>${it.title}</td> 
     <td>${it.price}</td> 
     </tr> 
    </g:each> 
    </table> 

那么你的指数是:

<html> 
    <head> 
    <!-- main layout reference --> 
    <meta name="layout" content="main"/> 
    </head> 
    <body> 
    THIS IS MY INDEX BODY CONTENT WITH AN INCLUDE 
    <g:render template="books"> 
    <g:link controller="book" action="list">See the full list!</g:link> 
    </body> 
</html> 

和你的名单将是:

<html> 
    <head> 
    <!-- main layout reference --> 
    <meta name="layout" content="main"/> 
    </head> 
    <body> 
    <g:render template="books" /> 
    </body> 
</html> 

(我的语法可能不是100%正确的,因为我已经完成了几个月的工作,但模板背后的想法是短暂的,可重用的GSP代码片段,它们本身并不意味着要显示。

+0

除了这里我必须在索引上下文中列出书籍列表:( – netbrain 2011-06-14 18:03:34