我可以选择用于 Wyam 页面的布局吗?



我正在为 Wyam 开发一个主题,我想知道是否有办法设置应在特定页面的 markdown 文件中使用的布局。据我到目前为止所看到的,似乎使用markdown创建的每个页面都使用_Layout.cshtml

更具体地说。我正在创建一个"about.md"页面,该页面的布局与其他(默认)页面不同。

所以我想做的是使用元数据来选择布局。例如

Layout: _About.cshtml

Layout: _About

怀亚姆可以做到这一点吗?

在剃刀文件中

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")
}));

然后,您将能够添加"布局"值作为前言,就像您在问题中写的那样。

总的来说,这是一个好主意,所以我也打开了一个问题,默认情况下将此行为添加到配方中。

最新更新