显示块的 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>
}
此致
哈坎
所以我一直在学习 .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>
}
此致
哈坎