C# 将形状添加到全局区域,而不是Orchard中的局部区域

C# 将形状添加到全局区域,而不是Orchard中的局部区域,c#,orchardcms,C#,Orchardcms,问题简而言之: 我已经创建了一个新的内容部分,并希望在另一个区域LeftPanel中显示它,该区域位于主内容区域之外。这不起作用,因为我只能将contentpart添加到内容区域内的本地区域。 如何将contentpart添加到页面上的其他区域 详细解释: 我们的团队创建了一个新的Orchard网站,并为其创建了一个布局。 有几个可用区域,其中大多数区域在所有页面上都可见。这些是主题中可用的所有区域: 区域:页眉、导航、内容、左面板、右面板、工具栏、消息、地址、页脚、副本 我创建了一个新的con

问题简而言之:

我已经创建了一个新的内容部分,并希望在另一个区域LeftPanel中显示它,该区域位于主内容区域之外。这不起作用,因为我只能将contentpart添加到内容区域内的本地区域。 如何将contentpart添加到页面上的其他区域

详细解释:

我们的团队创建了一个新的Orchard网站,并为其创建了一个布局。 有几个可用区域,其中大多数区域在所有页面上都可见。这些是主题中可用的所有区域:

区域:页眉、导航、内容、左面板、右面板、工具栏、消息、地址、页脚、副本

我创建了一个新的contentpart并将其附加到contenttype页面。使用此contentpart,可以向页面添加横幅。 其实施相当简单,当我把它们放在内容区时,一切似乎都正常工作

我在驱动程序中放置的相关代码如下:

protected override DriverResult Display(BannerPart part, string displayType, dynamic shapeHelper)
{
return ContentShape("Parts_Banner", 
                        () => shapeHelper.Parts_Banner(
                                    FirstImageTitle: part.FirstImageTitle,
                                    FirstImageLocation: part.FirstImageLocation,
                                    FirstImageNavigationUrl: part.FirstImageNavigationUrl,
                                    SecondImageTitle: part.SecondImageTitle,
                                    SecondImageLocation: part.SecondImageLocation,
                                    SecondImageNavigationUrl: part.SecondImageNavigationUrl,
                                    ThirdImageTitle: part.ThirdImageTitle,
                                    ThirdImageLocation: part.ThirdImageLocation,
                                    ThirdImageNavigationUrl: part.ThirdImageNavigationUrl
                                    ));
}
<Placement>
    <Place Parts_Banner="LeftPanel:1"/>
    <Place Parts_Banner_Edit="Content:7"/>
</Placement>
在placement.info文件中包含以下文本:

<Placement>
    <Place Parts_Banner="Content:before"/>
    <Place Parts_Banner_Edit="Content:7"/>
</Placement>
看起来没有任何效果,它不再呈现在页面上

在研究了一段时间后,我偶然发现了这个问题

我已经使用了
IWorkContextAccessor
,但是没有成功地将
LeftPanel
区域中的contentpart。 以下代码不起作用:

protected override DriverResult Display(BannerPart part, string displayType, dynamic shapeHelper)
{
    var shape = shapeHelper.Parts_Banner(
        FirstImageTitle: part.FirstImageTitle,
        FirstImageLocation: part.FirstImageLocation,
        FirstImageNavigationUrl: part.FirstImageNavigationUrl,
        SecondImageTitle: part.SecondImageTitle,
        SecondImageLocation: part.SecondImageLocation,
        SecondImageNavigationUrl: part.SecondImageNavigationUrl,
        ThirdImageTitle: part.ThirdImageTitle,
        ThirdImageLocation: part.ThirdImageLocation,
        ThirdImageNavigationUrl: part.ThirdImageNavigationUrl
        );


    _workContextAccessor.GetContext().Layout["LeftPanel"].Add(shape, 10);

    return new DriverResult();
}
看起来Clay正在创建一个具有空属性的新(区域?)对象。不知怎么的,乌节找不到这个区域。我怀疑这与全球区域和本地区域有关,但我当然可能错了

通过区域枚举也不起作用,因为它没有GetEnumerator()方法,这将创建一个异常

foreach (var zone in _workContextAccessor.GetContext().Layout.Zones)
{
    _workContextAccessor.GetContext()
                        .Layout.Zones[zone]
                        .Add(shape, 1);
}
我可能在Bertrand的帖子中遗漏了什么。我看到他正在创建一个具有Zones属性的模型并使用它,但我不知道该如何工作(即使在查看了他在博客文章中提供的解决方案之后)

内容模板如下所示:

<article class="content-item @contentTypeClassName">
    <header>
        @Display(Model.Header)
        @*@if (Model.Meta != null) {
        <div class="metadata">
            @Display(Model.Meta)
        </div>
        }*@
    </header>
    @Display(Model.Content)
    @if(Model.Footer != null) {
    <footer>
        @Display(Model.Footer)
    </footer>
    }
</article>

@显示(型号标题)
@*@如果(Model.Meta!=null){
@显示(Model.Meta)
}*@
@显示(Model.Content)
@如果(Model.Footer!=null){
@显示(Model.Footer)
}
我发现当我修改
placement.info
以使用
内容
页脚
区域时,它似乎正在工作。然而,这并不十分正确。当我使用
Footer:before
符号时,它将横幅放在
内容
区域的
之前,因此不会放在真正的
Footer
区域之前,后者位于
内容
区域之外


关于如何解决此问题的任何建议或解决方案,以便我可以将此contentpart放置到页面上的其他区域?

可能的答案(如果没有,至少可能有用):该问题的答案非常有用。同样有用的是randompete在这里的帖子:刚刚遇到这个,看起来MiBu链接中的答案已经过时了。从placement.info:
推送到全局区域的正确语法,其中“Footer”是主题中全局区域的名称,ShapeName是形状的名称。基本上,当您要引用全局区域而不是本地区域时,只需在区域名称的开头添加一个正斜杠。参照“/xxxx”放置规范,将项目放置在全局区域而不是本地区域中,这似乎仅适用于位于主题中的placement.info文件(也就是说,在我写这篇文章的时候,它对模块中的placement.info文件没有影响)。不确定这是一个bug还是一个设计决策,但这是一个值得警惕的问题