【问题标题】:Piranha CMS MVC tag problem with displaying blocks显示块的 Piranha CMS MVC 标签问题
【发布时间】: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 和其他基本文件都很好,没有任何重大区别。

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

干杯

【问题讨论】:

    标签: .net asp.net-core piranha-cms


    【解决方案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 和类型名称。你知道为什么吗?
    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    相关资源
    最近更新 更多