Что такое Grails GSP, эквивалентный ContentPlaceHolder ASP?

Я много играл с концепциями шаблонов/макетов в 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 это будет выглядеть так:

моймастер.мастер:

<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>


Мой вопрос:
Могу ли я сделать то же самое поведение по умолчанию/переопределение в GSP Grails?


person Polaris878    schedule 16.09.2011    source источник


Ответы (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.

person Jason Gritman    schedule 17.09.2011
comment
Джейсон, спасибо! Я даже не думал о том, чтобы поместить вызов render в атрибут по умолчанию... Помещение вызова рендеринга в атрибут по умолчанию отлично работает. Спасибо! - person Polaris878; 17.09.2011

Я думаю, вы можете попробовать вместо этого.

<g:render template=""><g:render>
person Jackie    schedule 24.08.2012