在 OrchardCMS 中获取 HTML 小部件的标题

Get title of an HTML Widget in OrchardCMS

如何在 Orchard CMS 中获取 HTML 小部件(在本例中为 "default" TripelFirst)的标题?新手问题,但我想不通

这是代码,我只是不知道如何将标题放入 "panel-heading" div。

@if (Model.TripelFirst != null || Model.TripelSecond != null || Model.TripelThird != null) {
                <div class="row">
                    @if (Model.TripelFirst != null) {
                        <div class="col-md-4 panel panel-success" runat="server" id="TripelFirst">
                            <div class="panel-heading">@Model.TripelFirst.Title()</div>
                            <div class="panel-body">@Model.TripelFirst.Body</div>
                        </div>
                    }
                    @if (Model.TripelSecond != null) {
                        <div class="col-md-4 panel panel-success" runat="server" id="TripelSecond">@Display(Model.TripelSecond)</div>
                    }
                    @if (Model.TripelThird != null) {
                        <div class="col-md-4 panel panel-success" runat="server" id="TripelThird">@Display(Model.TripelThird)</div>
                    }
                </div>
            }

首先,您似乎混淆了区域和小部件。 TripelFirst 是一个区域,而不是一个小部件(有关什么是区域的 in-depth 的更多解释,请参阅“So what are zones really?”)。区域应被视为一个占位符,一个将添加小部件的容器。 Orchard 有一个丰富的组合模型,其中许多解耦的服务参与页面的渲染。该区域本身几乎不知道它里面有什么,它只会在时机成熟时将渲染委托给它的内容(例如小部件)。因此,该区域不会提供获取其包含的小部件标题的最简单方法。 到目前为止,在 Orchard 中自定义渲染的最简单方法是从正确的位置进行:D在 Orchard 中可以有包装器,它们是呈现周围形状本身的模板。

乍一看这可能有点吓人,但 Orchard 提供了一个开箱即用的奇妙工具,可以轻松发现页面的形状结构。从你的开发机器上的设计器工具模块启用 "shape tracing" 功能(当然永远不要在生产中激活它),你会在页面底部得到一个漂亮的 Firebug-like 调试面板,你可以用来探索 shapes/templates 的树、每个树的模型等

理解 Orchard 渲染的另一个重要概念是放置文件,它主要描述表示内容项的形状应该以什么顺序渲染。

最后,要控制进入 TripelFirst 区域的小部件标题的呈现,使用形状跟踪找到您需要在主题中覆盖的模板,然后修改呈现这个模板正是您所需要的。

这是一个代码示例,您可以将其放入内容部分模板覆盖(例如 Parts.Title.cshtml),它首先找到当前部分的内容项,然后到达 Title部分,并将其显示为 link.

@{
    Orchard.ContentManagement.ContentItem contentItem =
        Model.ContentPart.ContentItem;
    string title = Model.Title.ToString();
}

<h2>@Html.ItemDisplayLink(title, contentItem)</h2>

使用形状追踪工具,它帮助我理解了模型结构。现在我并不是说这是 Orchard 团队希望完成的方式,但这是我最终解决问题的方式。

@if (Model.SideItems != null)
{
    <div class="col-md-12">&nbsp;</div>
    var sideWidgetItems = ((IEnumerable<dynamic>)Model.SideItems.Items).Where(x => x.ContentItem.ContentType == "HtmlWidget");
    if (sideWidgetItems.Any())
    {
        foreach (var item in sideWidgetItems)
        {
           <div class="col-md-12">
               <div class="panel panel-success">
                  <div class="panel-heading">@Html.Raw(item.ContentItem.Content.Parts[3].Title)
                  </div>
                  <div class="panel-body">@Html.Raw(item.ContentItem.Content.Parts[1].Text)
                  </div>
              </div>
           </div>
        }
    }
}