一种使用液体访问字段内容的方法

A way access field content with liquid

我正在使用最新的 NuGet 版本的 orchard core。因为我想使用 Bulma 作为 CSS 框架,所以我需要创建模板。我遇到的几个问题之一是:如何从液体模板中访问字段内容。

例如,博客主题的内容类型为文章。在 Article 中有一个字段 Subtitle。我创建了模板 Article-TextField as

<h2 class="subtitle">{{ Model.Field.Text }}</h2>

类似的 .cshtml 模板可以工作,但显然使用液体模板,无法访问 TextField Text 属性。我怎样才能以正确的方式做到这一点?

问题是 OrchardCore.ContentFields 模块没有向 Liquid 的 TemplateContext.GlobalMemberAccessStrategy 服务注册 TextField 类型,这会阻止您访问 [=12= 上的任何成员] 对象。

模块确实像这样注册 DisplayTextFieldViewModel

TemplateContext.GlobalMemberAccessStrategy.Register<DisplayTextFieldViewModel>();

这不仅是不必要的,因为 LiquidViewTemplate 已经自动注册了模型,而且对您也没有太大帮助,因为您只能访问模型的 Field 属性,但不是它的 Text 属性.

例如,这将产生一些输出:

{{ Model }}

这也是:

{{ Model.Field }}

但是正如您正确地注意到的那样,这不会:

{{ Model.Field.Text }}

这显然是 Orchard Core 中的一个遗漏,特别是在 ContentFields 模块中。

由于您使用的是 NuGet 包,因此您显然无法将其破解到源代码中。但是你可以做的是在你的主题中添加一个 Startup class 派生自 StartupBase 并添加以下静态构造函数:

static Startup()
{
    TemplateContext.GlobalMemberAccessStrategy.Register<TextField>();
}

确保引用 OrchardCore.ContentFields NuGet 包并导入要编译的主题的 OrchardCore.ContentFields.Fields 命名空间。

之后,您将能够从您的 Liquid 模板访问 Text 属性。

最后,我建议您在 GitHub 上提交有关此遗漏的问题,以便您最终可以从主题的启动文件中删除我提到的代码。