Grails g:include可以做到吗?

问题描述

| 我想知道是否可以使用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代码,它们并不打算显示在他们自己的。