我的情况是,我有一个类,它接收一个PublishingPage实例,并且我想枚举在此页面的布局页中使用的所有Web部件区域。
这证明是很困难的。
PublishingPage有一个名为Layout的属性,类型为PageLayout。 这与继承(最终)到具有Zones属性的Page的PublishingLayoutPage不同。 这个PageLayout类型没有任何对我需要的普通ASP.NET Page类型的Zones属性的引用。
我可以从PublishingPage.Layout属性获取SPListItem和SPFile,并以原始文本形式获取页面布局的内容,但无法使用XmlReader解析它,因为它不是有效的XML(具有无效的<%标记)。
我可以从PublishingPage.ListItem.Web获取一个SPWeb,这可以让我获得SPLimitedWebPartManager,在其中可以获取LimitedWebParts的集合(其中包含Zone信息)- 但这不会帮助,因为在我代码的这个阶段我没有Web部件。
我非常困惑,看起来发布基础结构与ASP.NET和SharePoint都相当独立。
更新:
我可以使用SPLimitedWebPartManager向Web部件区域添加虚拟Web部件(例如新ContentEditorWebPart),但是当我保存并检查页面时将其签入(并获取新的SPLWPM)时,我可以收到WebParts ,但Zone属性为null(ZoneID属性填充并正确)。