SharePoint Onlineに対して、プログラムからサイドリンクバーやトップリンクバーにアクセスする方法を説明します。
確認環境:Visual Studio 2017(C#), Office 365 Business Premium, CSOM
SharePoint Onlineへの接続
前提条件としてCSOMのClientContextクラスのオブジェクトは作成済みで、SharePoint Onlineの認証も済んでいるとします。
この方法は以前に書きました。
CSOMでは、ClientContextを用いて、SharePoint Onlineのサイトからサイドリンクバーやトップリンクバーの情報を取得することになります。
サイドリンクバー
サイドリンクバーは各サイト別に作成する画面左側のリンク集です。
サイドリンクバーにアクセスするためには、Microsoft.SharePoint.Client.WebクラスのNavigationプロパティ(Microsoft.SharePoint.Client.Navigationクラス)にアクセスし、更にそのQuickLaunchプロパティと順を追う必要があります。
このプロパティはMicrosoft.SharePoint.Client.NavigationNodeCollectionクラスです。つまりforeachで回せます。
個別のNavigationNodeはTitleプロパティでリンクテキスト、UrlはリンクのURL。
また、リンクを親子の2階層で持つことができ、その際はNavaigationNodeクラスが持つChildrenプロパティからそのリンクの子のリンクにアクセスです。TitleやUrlと違ってcontext.Loadする際に、Childrenプロパティを明示的にIncludeしないといけません。
以下のように取得します。コンソールプログラムのプロジェクトです。プロパティ出力ロジックは、トップリンクバーと共有することを考えてメソッドに切り出しました。
var navigation = web.Navigation; context.Load(navigation.QuickLaunch, includes => includes.Include(i => i.Title, i => i.Url, i => i.Children)); context.ExecuteQuery(); // サイドリンクバー Console.WriteLine("サイドリンクバー:"); navigation.QuickLaunch .ToList() .ForEach(navigationNode => PrintNavigation(navigationNode)); static void PrintNavigation(NavigationNode node, bool isParentLevel = true) { var spaces = isParentLevel ? "\t" : "\t\t"; var message = string.Format("{0}リンクテキスト:{1} URL:{2}", spaces, node.Title, node.Url); Console.WriteLine(message); // 子リンクがあればタブで頭下げして出力する //(MSDNによるとChildrenプロパティはnullにはならないのでチェックしない) if (isParentLevel) node.Children.ToList().ForEach(childNode => PrintNavigation(childNode, false)); }
結果例
サイドリンクバー: リンクテキスト:ホーム URL:/ リンクテキスト:ドキュメント URL:/Shared Documents/Forms/AllItems.aspx リンクテキスト:最近使った項目 URL: リンクテキスト:task URL:/Lists/task/AllItems.aspx リンクテキスト:リンク集 URL:/Lists/List3/AllItems.aspx リンクテキスト:サイトのページ URL:/SitePages/Forms/AllPages.aspx リンクテキスト:サブサイト URL:/_layouts/15/viewlsts.aspx?ShowSites=1 リンクテキスト:ページ URL:/SitePages/Forms/AllPages.aspx リンクテキスト:サイト コンテンツ URL:/_layouts/15/viewlsts.aspx
トップリンクバー
トップリンクバーはサイト上部のリンク集です。
基本的にはサイドリンクバーと同じです。QuickLaunchプロパティの代わりにTopNavigationBarプロパティにアクセスします。
このプロパティもNavigationNodeCollectionなのは同じ。
よってサンプルコードも似ています。
var navigation = web.Navigation; context.Load(navigation.TopNavigationBar, includes => includes.Include(i => i.Title, i => i.Url, i => i.Children)); context.ExecuteQuery(); // トップリンクバー Console.WriteLine("トップリンクバー:"); navigation.TopNavigationBar .ToList() .ForEach(navigationNode => PrintNavigation(navigationNode));
結果例
トップリンクバー: リンクテキスト:ホーム URL:/ リンクテキスト:ハウスソフト URL:/house-soft リンクテキスト:実験用 URL:/experiments リンクテキスト:株 URL:/stock
ただし、リンクの継承をしているサブサイトを対象にこのサンプルコードを動かすと結果は空です。
その場合は、継承元のサイトを対象にする必要があるようです。