Могу ли я выбрать макет для страницы с помощью Wyam?

Я работаю над темой для Уайам, и мне интересно, есть ли способ установить макет, который следует использовать в файле уценки для конкретной страницы. Насколько я видел до сих пор, кажется, что каждая страница, созданная с уценкой, использует _Layout.cshtml

Чтобы быть более конкретным. Я создаю страницу «about.md», макет которой отличается от других страниц (по умолчанию).

Итак, что я хотел бы сделать, это использовать метаданные для выбора макета. Например

Layout: _About.cshtml

или

Layout: _About

Возможно ли это с Wyam?


2
134
1

Ответ:

Решено

В файле Razor

Страницы в рецептах Wyam (я предполагаю, что вы используете рецепт блога или документации) обрабатываются Razor. В рецепте используется _Layout.cshtml по соглашению, но альтернативные макеты могут быть указаны с использованием стандартного синтаксиса Razor. Вы можете сделать это, разместив следующее в верхней части файла «О странице» .cshtml (под вступительной части):

@{
    Layout = "_About.cshtml";
}

В файле уценки

Файлы Markdown также обрабатываются движком Razor, поэтому описанная выше техника было бы работает, если бы процессор Markdown не экранировал символ @. На самом деле нет хорошего способа обойти это, и простой ответ на ваш вопрос: вы не можете указать альтернативный макет для файла Markdown.

Однако одно из преимуществ использования генератора кода, такого как Wyam, заключается в том, что у вас есть большой контроль. В этом случае вы можете заменить конвейер RenderPages на тот, который будет делать именно то, что вы хотите. Добавьте в свой файл wyam.config следующее:

int index = Pipelines.IndexOf(Blog.RenderPages);
Pipelines.Remove(Blog.RenderPages);
Pipelines.Insert(index, Blog.RenderPages,
    (IPipeline)new Wyam.Web.Pipelines.RenderPages(
        Blog.RenderPages,
        new Wyam.Web.Pipelines.RenderPagesSettings
        {
            Pipelines = new string[] { "Pages" },
            Layout = (doc, ctx) => doc.String("Layout", "/_Layout.cshtml")
        }));

Затем вы сможете добавить значение «Макет» в качестве переднего плана точно так же, как вы написали в своем вопросе.

В целом это была хорошая идея, поэтому я также открыл вопрос, чтобы добавить это поведение в рецепт по умолчанию.


Интересные вопросы для изучения