我有一种情况,我拥有的一个类被传递了一个 PublishingPage 实例,我想枚举在此页面的布局页面中使用的任何和所有 Web 部件区域。
事实证明这很艰难。
PublishingPage 有一个名为 Layout 的属性,它的类型为 PageLayout。这与 PublishingLayoutPage 不同,后者(最终)继承到具有 Zones 属性的 Page。此 PageLayout 类型没有对具有我需要的 Zones 属性的普通 ASP.NET Page 类型的任何引用。
我可以从 PublishingPage.Layout 属性中获取一个 SPListItem 和一个 SPFile,并以原始文本形式获取页面布局的内容,但这不能用 XmlReader 解析,因为它不是有效的 XML(具有无效的 <% 标记)。
我可以从 PublishingPage.ListItem.Web 获得一个 SPWeb,这可以让我获得一个 SPLimitedWebPartManager,我可以在其中获得 LimitedWebParts 的集合(其中包含区域信息)——但这无济于事,因为在我的代码的这个阶段我有没有 Web 部件。
我很困惑,看起来发布基础结构与 ASP.NET 和 SharePoint 完全分离。
更新:
我可以使用 SPLimitedWebPartManager 将虚拟 Web 部件(如新的 ContentEditorWebPart)添加到 Web 部件区域(我有使用的区域的名称),但是当我保存它并重新检查页面时(并获取一个新的 SPLWPM),我可以取回 WebPart,但 Zone 属性为空(ZoneID 属性已填充且正确)。