显示块的 Piranha CMS MVC 标签问题

Posted

技术标签:

【中文标题】显示块的 Piranha CMS MVC 标签问题【英文标题】:Piranha CMS MVC tag problem with displaying blocks 【发布时间】:2020-08-30 07:36:33 【问题描述】:

所以我一直在为 .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 和其他基本文件都很好,没有任何重大区别。

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

干杯

【问题讨论】:

【参考方案1】:

我已经在 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>

最好的问候

哈坎

【讨论】:

此解决方法在站点呈现时有效,但当我尝试通过 API 调用呈现部分视图时它对我不起作用。我在同一个项目中有一个用于此类型的 DisplayTemplate .cshtml 文件。我只显示 ID 和类型名称。你知道为什么吗?

以上是关于显示块的 Piranha CMS MVC 标签问题的主要内容,如果未能解决你的问题,请参考以下文章

让 Piranha CMS 与 MVC 一起工作

现有 MVC 5 站点上的 Piranha CMS

piranha CMS 的 Sysparam 错误

在 Piranha CMS 中访问全球站点区域

Piranha CMS 本地化

自定义区域内的 Piranha CMS HtmlRegion 不保存内容