如何从布局文件将变量传递到grails模板?

时间:2009-12-01 22:13:51

标签: grails layout templates

所以我有一个导航模板(/common/_navigation.gsp),它在Grails项目主布局文件(/layouts/main.gsp)中呈现。如何将某些变量/参数/ arg从单个视图文件传递到布局并最终传递到导航模板中?我只想在页面上突出显示正确的标签。

(我们已经尝试过使用Grails Navigation Plugin。由于我们有不同的标签指向相同的控制器(相同的视图,不同的过滤器),它会分解。)

7 个答案:

答案 0 :(得分:20)

我一直都是这种模式。在我看来,我可以手动或通过在我正在渲染的视图中使用参数标记将属性附加到页面。它没有在Grails用户指南中记录,但它非常方便。

<parameter name="foo" value="bar" />

然后我将使用pageProperty tag访问页面属性。

<g:set var="activeNavItem" value="${pageProperty(name: 'page.foo')}"/>

布局根本不需要处理这个变量: - )

答案 1 :(得分:18)

只需使用model参数 例如: 视图:

<g:render template="../path/template" model="[header:'test', headers:['a','b'], values:[['a':1,'b':2],['a':3,'b':4]] ]"/>

_template:

<br/>
    <h3>${header}</h3>
    <table>
      <thead>
        <tr>
          <g:each in ="${headers}" var="he">
            <th>${he}</th>
          </g:each>
        </tr>
      </thead>
      <tbody>
        <g:each in ="${values}" var="v">
              <tr>
                <g:each in ="${headers}" var="h">
                  <td>${v[h]}</td>
                </g:each>
              </tr>
          </g:each>
      </tbody>
    </table>

答案 2 :(得分:13)

我使用一种可以说更简单的方法。在调用布局之前,只需在单个视图中的请求范围内定义变量。它将在请求中使用的所有模板中提供,包括布局和通过<g:render>

调用的任何模板
<g:set var="SOMEVARIABLE" value="SOMEVALUE" scope="request"/>
<meta name="layout" content="yourlayout">

然后,就像引用布局中的任何其他模板或视图中提取的其他模板一样引用变量

${SOMEVARIABLE}  or <g:if test="${SOMEVARIABLE}">, etc., etc

答案 3 :(得分:2)

您需要使用页面属性:http://grails.org/doc/1.1.1/ref/Tags/pageProperty.html

然后使用模型参数将其传递给render标记。

欢呼声

答案 4 :(得分:1)

我喜欢的模式,使用pageProperty如下。在布局中,我像这样引用pageProperty:

布局gsp

<body id="${pageProperty(name: 'page.pageType')}">
    <g:render template="/layouts/header" />
    <g:layoutBody/>
    <g:render template="/layouts/copyright" />
</div>

...并且在特定gsp页面的<head>部分内(我发现它在head部分之外没有工作),我声明了这样的值:

页面gsp

<head>
    <meta name="layout" content="main"/>
    <parameter name="pageType" value="homePg" />
</head>

结果HTML

<body id="homePg">
    ... header, body and footer ...
</body>

另外,我可以将控制器模型中的值注入pageProperty,如下所示:

<强>控制器

def index() {
    model: [modelPageType: 'adminPg']
}

布局gsp(使用与上面相同的布局)

<body id="${pageProperty(name: 'page.pageType')}">
    <g:render template="/layouts/header" />
    <g:layoutBody/>
    <g:render template="/layouts/copyright" />
</div>

页面gsp

<head>
    <meta name="layout" content="main"/>
    <parameter name="pageType" value="${modelPageType}" />
</head>

结果HTML

<body id="adminPg">
    ... header, body and footer ...
</body>

答案 5 :(得分:0)

通过从params获取变量,您可以简单地访问页面中任何模板中的任何变量。 只需在布局中输入${params.variable},您就会得到变量。

答案 6 :(得分:-3)

根据我的阅读材料,我认为将变量传递给布局并不是一个好习惯。您可以在视图中访问模型变量。我认为布局应仅用于指定页面的结构,而视图可用于填充内容。