显示块的 Piranha CMS MVC 标签问题

Piranha CMS MVC tag problem with displaying blocks

所以我一直在学习 .Net Core 3.1 的 Piranha CMS。

阅读文档并研究模板后,我在从 Blocks 中获取信息以正确显示在页面上时遇到了一些困难。

Page.cs 上的 Razor 博客模板中,开发人员使用以下代码在屏幕上显示页面上的块

    <h1>@Model.Data.Title</h1>

@Html.DisplayFor(m => m.Data.Blocks)

在模板网站的关于我页面上显示如下: Image of what should happen

在我自己的网站上,我编写了相同的内容,并为页面分配了一些简单的文本块以对其进行测试,但是我得到以下内容:My Site

谁能指出我可能犯的错误的正确方向?

Startup.cs和其他基本文件都很好,没有什么大的区别。

我在网站上看到的唯一区别是我的网站缺少样式。但我不明白为什么这会影响它。

干杯

我已经在 Gitter 聊天中回答了,但如果其他人有同样的问题,我也会在这里回答。

显示模板和编辑器模板

模板系统是 ASP.NET Core 的内置功能,并假定您的项目中存在以下文件夹。

MVC

Views
Views/DisplayTemplates
Views/EditorTemplates

剃刀页面

Pages
Pages/DisplayTemplates
Pages/EditorTemplates

调用模板

当您对对象集合调用 DisplayFor() 时,就像您从 Razor 博客模板 ASP.NET 引用的代码一样,会自动选择名称与类型名称相对应的模板。所以在这种情况下,如果您的块是 Piranha.Extend.Blocks.TextBlock 类型,它将尝试定位视图文件:

Pages/DisplayTemplates/TextBlock.cshtml

现在,如果您在视图中有自己的循环,假设您想在每个块周围添加一个包含 div 并将单个对象放入 EditorFor() 的标准渲染 ASP.NET 将被执行,它只打印出给定对象的属性。

不会按照您想要的方式工作

@foreach (var block in Model.Data.Blocks)
{
  <div class="myclass">
    @Html.DisplayFor(m => block)
  </div>
}

解决方法

简单的解决方法是只提供要呈现块的 DisplayTemplate 的名称。这可以通过以下方式轻松实现:

@foreach (var block in Model.Data.Blocks)
{
  <div class="myclass">
    @Html.DisplayFor(m => block, block.GetType().Name)
  </div>
}

此致

哈坎