问题描述
|
我想知道是否可以使用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)仅包括在书/目录页中定义的表。但是,当我尝试此操作时,它包括定义的整个html(<html>
标签和所有标签)。
有可能这样做吗?我已经尝试过诸如<g:include controller=\"book\" action=\"list\" view=\"someView.gsp\"/>
之类的操作,但这不起作用。我真的想避免不得不向要重用现有控制器的“索引控制器”添加书目清单逻辑。
我不能成为第一个拥有这种用例的人,你们提供了什么解决方案?
解决方法
您可以使用
applyLayout
标签。只需创建一个empty.gsp
布局即可:
<g:layoutBody/>
然后用applyLayout
装饰include
标签:
<g:applyLayout name=\"empty\">
<g:include controller=\"book\" action=\"list\"/>
</g:applyLayout>
请参阅Grails指南上的条目以获取更多参考。
, 这是恕我直言直接不可能的。一个想法是创建一个基于g:include
的自定义标签,该标签通过例如xpath表达式。我不知道此位置已经存在。
一种替代方法是将本书的“ 12”的正文部分重构为模板,并使用“ 14”从“ 13”中引用该模板。但这意味着数据模型必须在index.gsp上下文中可用,因为g:render不会调用控制器。
注意:使用using11时,最好使用springcache插件进行页面片段缓存。
, 是的,但是您需要在那里再增加一层。查看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代码,它们并不打算显示在他们自己的。