【问题标题】:How to assign a GSP variable in a Grails template body()?如何在 Grails 模板 body() 中分配 GSP 变量?
【发布时间】:2011-09-19 20:16:35
【问题描述】:

在我的 Grails 1.3.7 应用程序中,我想使用模板从视图中分解出周围的 HTML。但是,GSP 变量赋值在包含的 body() 中不起作用。我该如何执行以下操作?

_aTemplate.gsp:

<div class="example">
    <% out <<  body() %>
</div>

aView.gsp:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="layout" content="main" />
</head>
<body>
    <g:set var="foo" value="${42}"/>
    <% assert foo == 42 : foo %>

    <tmpl:/aTemplate>
        <g:set var="bar" value="${6}"/>
        <% assert bar == 6 : bar %>
    </tmpl:/aTemplate>
</body>
</html> 

bar 的赋值不起作用:bar 断言失败,当我得到 http://localhost:8080/myApp/aView.gsp

org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException:
 Error executing tag<g:render>: Assertion failed:
(bar == 6). Values: bar = null
 at /Users/jbeutel/proj/grailsSandboxes/myApp/grails-app/views/aView.gsp:13 

如何让模板 body() 正常工作?

或者,有没有其他方法可以在保持 HTML 平衡的同时分解周围的 HTML?我的用例不在顶层,所以我没有尝试使用布局。如果我使用 TagLib 闭包而不是模板文件,则变量分配有效,但我不想将大量 HTML 放入闭包中,因此无论如何我都需要将不平衡的 HTML 放入模板文件中(即,之前的单独模板和身体之后)。有没有更好的办法?

【问题讨论】:

  • 您对使用布局的了解有多大?在我看来,它们可能更有利于解决您的问题。我没有在您描述的情况下使用它们(所以我没有足够的信心发布实际答案),但&lt;g:applyLayout/&gt; 似乎它可能会提供一些美味的功能。如果不出意外,如果以类似的方式使用,它可能不会受到您观察到的相同行为的影响(但同样,我不确定)。只是一个建议。
  • 谢谢!该内联布局有效。我将&lt;% out &lt;&lt; body() %&gt; 更改为&lt;g:layoutBody /&gt;,将view/_aTemplate.gsp 更改为layouts/aLayout.gsp,并使用&lt;g:applyLayout name="aLayout"&gt; 调用它。布局和正文中的代码似乎都在工作;我也不需要为布局提供参数映射。
  • 但是,我遇到了一个问题:布局仅从控制器获取模型。除了 pageProperty 字符串之外,我没有看到 aView.gsp 传递任何内容的方法。

标签: templates grails gsp


【解决方案1】:

您可以将 .gsp 中的变量传递到共享模板中,然后它可以按如下方式考虑。如果它们位于 login.gsp 页面上,我这样做是为了在我的公共标题中隐藏一个“登录”链接

<g:render template="/layouts/header" model="['hidelogin':true]"/>

然后在_header.gsp中

<g:if test="${!hidelogin}">
    //show your login link
</g:if>

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2019-07-22
    • 1970-01-01
    • 2011-11-18
    • 2013-09-29
    • 1970-01-01
    相关资源
    最近更新 更多