2

我想知道是否可以使用 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"/>但这不起作用。我真的很想避免将书单逻辑添加到我想重用现有控制器的“索引控制器”中。

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

4

3 回答 3

6

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

<g:layoutBody/>

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

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

请参阅Grails 指南中的条目以获取更多参考。

于 2011-06-14T16:58:40.920 回答
0

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

另一种方法是将书籍的正文部分重构list.gsp模板index.gsp并从using中引用该模板g:render。但这意味着数据模型必须在 index.gsp 上下文中可用,因为 g:render 不调用控制器。

旁注:使用时g:include最好使用springcache 插件进行页面片段缓存。

于 2011-06-14T08:47:05.297 回答
-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 代码片段,它们并不打算单独显示。

于 2011-06-14T16:16:23.387 回答