什么是Grails GSP相当于ASP的ContentPlaceHolder?

时间:2011-09-16 19:32:42

标签: asp.net-mvc grails groovy gsp sitemesh

我一直在玩Grails GSP中的模板/布局概念。我一直在使用布局/内容块来模仿ASP的母版页行为。

例如,我在模板中使用标记<g:pageProperty />留下一个“占位符”,可以使用<content>标记覆盖:

myTemplate.gsp:

<body>
    <g:pageProperty name="page.topDiv" />
</body>


myPage.gsp:

<html>
    <head>
        <meta name="layout" content="myTemplate"></meta>
    </head>
    <body>
        <content tag="topDiv">
           My top div
        </content>
    </body>
</html>

这适用于将内容“追加”到模板中的某个位置。但是,我真的想要我在ASP.NET的母版页中可以获得的行为......这是为某些内容提供“默认”呈现,并允许可选的覆盖。在ASP.NET母版页中,它看起来像这样:

myMaster.master:

<asp:ContentPlaceHolder id="something" runat="server">
   <div>Default text/html here</div>
</asp:ContentPlaceHolder>


someOtherPage.aspx:

<asp:Content contentPlaceHolderId="something" runat="server">
    Overriden content here!!  I don't need to override this though :)
</asp:Content>


我的问题:
我可以在Grails的GSP中执行相同的默认/覆盖行为吗?

2 个答案:

答案 0 :(得分:2)

有几天你可以做到这一点。 g:pageProperty等同于Sitemesh decorator:getProperty标记,因此您可以使用default属性来指示要使用的默认文本。例如:

<g:pageProperty name="page.topDiv" default="Default text/html here"/>

但是,我不知道在那里获取HTML内容的干净方法。您可以使用g:if标记来测试该属性,并指定默认行为(如果它不存在):

    <g:if test="${pageProperty(name:'page.topDiv')}">
        <g:pageProperty name="page.topDiv"/>
    </g:if>
    <g:else>
        <div>Default text/html here</div>
    </g:else>

默认内容也可以存在于外部模板gsp中。然后可以使用render方法在默认属性g:pageProperty中显示该内容:

<g:pageProperty name="page.topDiv" default="${render(template:'topDiv')}"/>

在这种情况下,默认内容将位于_topDiv.gsp

答案 1 :(得分:1)

我想你可以试试。

<g:render template=""><g:render>