【问题标题】:Grails g:include can it be done?Grails g:include 可以做到吗?
【发布时间】:2011-06-14 08:04:05
【问题描述】:

我想知道是否可以使用 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(&lt;html&gt; 标签和所有)。

有可能以某种方式做到这一点吗?我尝试过&lt;g:include controller="book" action="list" view="someView.gsp"/&gt; 之类的方法,但这不起作用。我真的很想避免将书单逻辑添加到我想重用现有控制器的“索引控制器”中。

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

【问题讨论】:

    标签: grails grails-controller


    【解决方案1】:

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

    <g:layoutBody/>
    

    然后用applyLayout装饰你的include标签:

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

    请参阅Grails guide 上的条目以获取更多参考。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • spring 缓存插件也是我希望它按最初预期工作的原因之一。
      【解决方案3】:

      是的,但是您需要在其中再增加一层。查看 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 代码片段,它们并不意味着要单独显示.

      【讨论】:

      • 除了这里我必须在索引上下文中有书籍列表:(
      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      相关资源
      最近更新 更多