Я работаю над темой для Уайам, и мне интересно, есть ли способ установить макет, который следует использовать в файле уценки для конкретной страницы. Насколько я видел до сих пор, кажется, что каждая страница, созданная с уценкой, использует _Layout.cshtml
Чтобы быть более конкретным. Я создаю страницу «about.md», макет которой отличается от других страниц (по умолчанию).
Итак, что я хотел бы сделать, это использовать метаданные для выбора макета. Например
Layout: _About.cshtml
или
Layout: _About
Возможно ли это с Wyam?
В файле 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")
}));
Затем вы сможете добавить значение «Макет» в качестве переднего плана точно так же, как вы написали в своем вопросе.
В целом это была хорошая идея, поэтому я также открыл вопрос, чтобы добавить это поведение в рецепт по умолчанию.