我想知道是否可以使用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"/>
这样的东西,但这不起作用。我真的想避免为“索引控制器”添加一个图书清单逻辑,我想重用我现有的控制器。
我不能成为第一个拥有这个用例的人,你们想出了什么解决方案?
答案 0 :(得分:6)
您可以使用applyLayout
标记。只需创建empty.gsp
布局,只需:
<g:layoutBody/>
然后使用include
:
applyLayout
代码
<g:applyLayout name="empty">
<g:include controller="book" action="list"/>
</g:applyLayout>
请参阅Grails guide上的条目以获取进一步的参考。
答案 1 :(得分:0)
这是恕我直言,不可能。一个想法是创建一个基于g:include
的自定义标记,它可以删除部分代码。一个xpath表达式。我不知道这已经存在了。
另一种方法是将书籍list.gsp
的正文部分重构为template,并使用index.gsp
从g:render
引用该模板。但这意味着数据模型必须在index.gsp上下文中可用,因为g:render不会调用控制器。
附注:使用g:include
时,最好使用springcache plugin进行页面片段缓存。
答案 2 :(得分:-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代码片段,并不是要自己显示