Grails g:包括可以吗?

net*_*ain 2 grails grails-controller

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

假设我有一个主要布局页面如下:

<html>
  <head>
    <title>My start page</title>
    <g:layoutHead>
  </head>
  <body>
    <g:layoutBody>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

然后是主页面(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>
Run Code Online (Sandbox Code Playgroud)

最后是书/列表页面

<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>
Run Code Online (Sandbox Code Playgroud)

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

有可能以某种方式这样做吗?我尝试过这样的事情<g:include controller="book" action="list" view="someView.gsp"/>然而这不起作用.我真的想避免向"索引控制器"添加图书清单逻辑,我想重用我现有的控制器.

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

Gus*_*dez 6

您可以使用applyLayout标签.只需创建一个empty.gsp布局:

<g:layoutBody/>
Run Code Online (Sandbox Code Playgroud)

然后用以下内容装饰您的include标签applyLayout:

<g:applyLayout name="empty">
  <g:include controller="book" action="list"/>
</g:applyLayout>
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Grails指南中的条目.