Sitecore 7: объедините CSS из визуализаций в области макета ‹head›

это, вероятно, новичок Qs ... я использую Sitecore 7 для своего веб-приложения, и это то, что у меня есть до сих пор

  1. Шаблон данных - в нем есть только одно поле под названием «Заголовок» для отображения заголовка страницы.

  2. Один макет - это указывает на мой файл cshtml в пути проекта asp.net mvc. Он имеет полную разметку, начиная с Doctype. Тег заголовка под тегом заголовка использует расширение Sitecore Html для отображения поля «Заголовок» из шаблона, упомянутого в №1. Это также отображает представление ядра сайта через заполнитель, называемый "тело страницы" под тегом тела макета.

  3. Я создал визуализацию представления, указывающую на представление Razor, в моем проекте asp.net mvc. В этом представлении просто h1 вызывает привет, мир.

  4. Элемент Sitecore / Content / Home (из главного дерева sitecore) использует шаблон, созданный в # 1, и использует макет, созданный в # 2. Этот элемент имеет один и только один рендеринг, созданный в # 3.

Теперь, когда я попадаю в корень с моего локального сайта sitecore, все выглядит хорошо! Я вижу Hello World в теге H1 под тегом body с полным html makrup, упомянутым в макете ...

Здесь все начинает усложняться ... Теперь я хочу, чтобы мой рендеринг представления (созданный в №3) ссылался на файл CSS, который относится только к этому рендерингу. Этот CSS не будет относиться ко всем страницам. Конечно, я хочу добавить ссылку в шапку в виде ссылки href. Итак, попытался использовать asp.net mvs "Section", но я продолжаю получать эту сладкую ошибку ". Файл не может быть запрошен напрямую, потому что он вызывает метод rendersection ..." Итак, я понял, что мой рендеринг представления не имеет @ {Layout = " ... "} и, конечно же, управляется движком sitecore !!

Итак, я все же пошел дальше и добавил ссылку на макет в свое представление Файл cshtml рендеринга и сослался на тот же файл макета, что и Sitecore Engine (т.е. № 2 выше). У меня все еще такая же ошибка.

Затем я нашел сообщение Использование разделов в шаблонах Editor / Display который в основном предназначен для сценариев и пытался реализовать для CSS. Но это тоже не сработало, потому что рендеринг представления выполняется после выполнения тега Helper в заголовке, поэтому моя ссылка CSS никогда не выходит в поток. Кстати, для скриптов это решение работает идеально, потому что помощник по рендерингу скриптов вызывается после рендеринга представления Sitecore.

На данный момент я полностью застрял в вопросе «Как мне получить мою ссылку CSS для рендеринга представления в теге заголовка». Кто-нибудь из экспертов по sitecore может здесь помочь?


person theGreatEmperor    schedule 03.03.2014    source источник
comment
Почему бы просто не включить весь ваш CSS на все страницы и использовать селектор CSS для только целевого контента при рендеринге с помощью ID или css class селектор?   -  person jammykam    schedule 03.03.2014


Ответы (1)


Так что это определенно более сложная настройка, но мы делаем это с помощью Cassette и настройки renderLayout конвейера. Использование этого конвейера решает вашу проблему, связанную с вызовом помощника в теге head перед визуализацией вашего представления.

  1. Расширьте шаблон визуализации представления (/sitecore/templates/System/Layout/Renderings/View rendering) и добавьте поле, в котором хранится имя пакета кассет, который вы хотите включить на страницу.
  2. В вашем RenderLayoutProcessor прокрутите все отрисовки страниц (Sitecore.Context.Page.Renderings), проверьте элемент отрисовки для поля пакета (rendering.RenderingItem.InnerItem[YOUR_FIELD]) и вызовите Bundles.Reference Cassette.
  3. В заголовке основного макета назовите Cassette Bundles.RenderStylesheets().

Вы также можете сделать это без Cassette, но это значительно упрощает объединение, создание ссылок и включение скриптов и таблиц стилей.

Другим преимуществом этого подхода является то, что он не нарушает кеширование Sitecore. Любой подход, требующий выполнения кода в вашем представлении, сделает кеширование Sitecore HTML бесполезным, потому что, когда рендеринг кэшируется, ваш код не будет выполняться и стили страницы будут нарушены.

person nickwesselman    schedule 03.03.2014
comment
Для меня это звучит довольно излишне инженерно. Что делает Cassette, даже модуль IIS Request Reduce может сделать за меня, без необходимости добавлять одну строку кода. Пока у меня есть весь CSS в заголовке и все сценарии внизу страницы, IIS Request Reduce будет объединять, уменьшать и все эти полезные вещи во время выполнения. Дело в том, что я не понимаю, почему Sitecore не позволяет мне использовать Section и RenderSection. Несмотря на то, что рендеринг представления имеет упомянутый файл макета, Sitecore не любит добавлять вызов RenderSection в файл макета. - person theGreatEmperor; 05.03.2014
comment
Не знаю достаточно о Sitecore MVC, чтобы ответить на этот вопрос, но я думаю, вы обнаружите, что такой подход, скорее всего, лишит вас возможности использовать кэширование HTML Sitecore. - person nickwesselman; 06.03.2014