クラスに PublishingPage インスタンスが渡される状況があり、このページのレイアウト ページで使用されているすべての Web パーツ ゾーンを列挙したいと考えています。
これは厳しいことが証明されています。
PublishingPage には、PageLayout タイプの Layout というプロパティがあります。これは、Zones プロパティを持つ Page を (最終的に) 継承する PublishingLayoutPage とは異なります。この PageLayout タイプには、必要な Zones プロパティを持つ通常の ASP.NET Page タイプへの参照がありません。
PublishingPage.Layout プロパティから SPListItem と SPFile を取得し、生のテキスト形式でページ レイアウトのコンテンツを取得できますが、これは有効な XML ではないため XmlReader で解析できません (無効な <% タグがあります)。 )。
PublishingPage.ListItem.Web から SPWeb を取得できます。これにより、SPLimitedWebPartManager を取得できます。ここで、LimitedWebParts (Zone 情報を含む) のコレクションを取得できます。ただし、コードのこの段階では、 Web パーツはありません。
どうやら、公開インフラストラクチャは ASP.NET と SharePoint の両方から切り離されているようです。
アップデート:
SPLimitedWebPartManager を使用して、ダミーの Web パーツ (新しい ContentEditorWebPart など) を Web パーツ ゾーン (使用されているゾーンの名前を持っています) に追加できますが、これを保存してページをチェックインすると (そして新しい SPLWPM)、WebParts を元に戻すことはできますが、Zone プロパティは null です (ZoneID プロパティが入力され、正しい)。