问题简而言之:
我已经创建了一个新的内容部分,并希望在不同的区域LeftPanel中显示它,它位于主要内容区域之外。这不起作用,因为它似乎只能将contentpart添加到Content区域内的本地区域。 如何将contentpart添加到页面上的其他区域?
更长的解释:
我们的团队创建了一个新的Orchard网站,并为其创建了一个布局。 有几个区域可用,并且大多数区域在所有页面上都可见。这些是主题中可用的所有区域:
Zones: Header, Navigation, Content, LeftPanel, RightPanel, Toolbar, Messages, Address, Footer, Copy
我创建了一个新的contentpart并将其附加到contenttype页面。使用此contentpart,可以向页面添加横幅。 实现非常简单,当我将它们放在Content区域时,一切似乎都正常工作。
我在驱动程序中放置的相关代码如下:
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.info文件中包含以下文本:
<Placement>
<Place Parts_Banner="Content:before"/>
<Place Parts_Banner_Edit="Content:7"/>
</Placement>
这会将(内容部分的)横幅放在内容之前。
但是,我希望在LeftPanel
区域中呈现contentpart。将placement.info更改为以下内容:
<Placement>
<Place Parts_Banner="LeftPanel:1"/>
<Place Parts_Banner_Edit="Content:7"/>
</Placement>
似乎没有任何效果,它不再在页面上呈现。
在研究了这个问题后,我偶然发现Bertrand Le Roy's blogpost which does something similar with an Amazon buy-now part。
我玩过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正在创建一个具有空属性的新(区域?)对象。不知怎的,Orchard找不到这个区域。我怀疑它与全局区域和本地区域有关,但我当然可能是错的。
通过区域枚举也不起作用,因为它没有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>
我发现当我修改placement.info
以使用Content
或Footer
区域时,它似乎正在运行。然而,这并非如此。当我使用Footer:before
表示法时,它会将横幅放在<footer>
区域的Content
之前,因此不会位于{{1}之外的真实Footer
区域之前区域。
关于我应该如何解决此问题的任何建议或解决方案,以便我可以将此内容部分放在页面上的其他区域?