Grails g:包括可以吗?

时间:2011-06-14 08:04:06

标签: grails grails-controller

我想知道是否可以使用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"/>这样的东西,但这不起作用。我真的想避免为“索引控制器”添加一个图书清单逻辑,我想重用我现有的控制器。

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

3 个答案:

答案 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.gspg: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代码片段,并不是要自己显示