简而言之问题:
我创建了一个新的内容部分,并希望在另一个区域 LeftPanel 中显示它,该区域位于主内容区域之外。这不起作用,因为看起来我只能将内容部分添加到内容区域内的本地区域。如何将内容部分添加到页面上的不同区域?
更长的解释:
我们的团队创建了一个新的 Orchard 网站并为其创建了布局。有几个可用的区域,其中大部分在所有页面上都可见。这些是主题中可用的所有区域:
Zones: Header, Navigation, Content, LeftPanel, RightPanel, Toolbar, Messages, Address, Footer, Copy
我创建了一个新的内容部分并将其附加到内容类型页面。使用此内容部分,可以将横幅添加到页面。实现相当简单,当我将它们放在内容区域时,一切似乎都正常工作。
我放在Driver中的相关代码如下:
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
区域中呈现内容部分。将placement.info 更改为以下内容:
<Placement>
<Place Parts_Banner="LeftPanel:1"/>
<Place Parts_Banner_Edit="Content:7"/>
</Placement>
似乎没有任何效果,它不再呈现在页面上。
在对这个问题进行了一些研究之后,我偶然发现了Bertrand Le Roy 的博客文章,它与亚马逊的“立即购买”部分做了类似的事情。
我玩过IWorkContextAccessor
,但没有成功将 contentpart 放置在LeftPanel
区域中。以下代码不起作用:
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 正在创建一个具有空属性的新(区域?)对象。不知何故,果园找不到这个区域。我怀疑它与global zone和local zone有关,但我当然可能是错的。
枚举区域也不起作用,因为它没有 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
orFooter
区域时,它似乎正在工作。然而,这不是很正确。当我使用该Footer:before
符号时,它将横幅<footer>
放在Content
区域之前,而不是在实际Footer
区域之前,它位于Content
区域之外。
关于如何解决此问题的任何建议或解决方案,以便我可以将此内容部分放置到页面上的不同区域?