一种使用液体访问字段内容的方法
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 上提交有关此遗漏的问题,以便您最终可以从主题的启动文件中删除我提到的代码。
我正在使用最新的 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 上提交有关此遗漏的问题,以便您最终可以从主题的启动文件中删除我提到的代码。