CSOMでSharePointのナビゲーションを追加する

SharePoint Onlineに対して、プログラムからサイドリンクバーやトップリンクバーにリンクを追加する方法を説明します。

確認環境:Visual Studio 2017(C#), Office 365 Business Premium, CSOM

前提条件として、「CSOMでSharePointのナビゲーションを読み取る」のときと同じく、CSOMのClientContextクラスのオブジェクトは作成済みで、SharePoint Onlineの認証も済んでいるとします。

サンプルコードは、サイドリンクバーを対象に、追加します。

Web.Navigation.QuickLaunchがサイドリンクバーのリンク集を表しています。このプロパティがNavigationNodeCollectionクラスのオブジェクトなので、NavigationNodeCollecitonクラスに対する操作が主な作業です。

追加概要

追加の場合には、NavigationNodeCreationInformationクラスのオブジェクトが必要です。

手順としては、

  1. NavigationNodeCreationInformationクラスをインスタンス化
  2. インスタンスに、リンクのプロパティ(リンクテキスト、リンク先URL、リンクの位置)を設定
  3. QuickLauchのAddメソッドでインスタンスを追加
  4. CSOMなので、QuickLaunchをLoadしたうえで、ExecuteQuery

となります。

リンクのAPIは追加先の位置によって若干ですが違いがあります。

位置指定なしの場合:先頭に追加

実際に追加してみます。

実行前のサイドリンクバーはこんな感じ。

位置指定なしで追加するサンプルコード

var web = context.Web;
var ci = new NavigationNodeCreationInformation()
{
    Title = "test",
    Url = "https://msdn.microsoft.com/ja-jp/default.aspx"
};
web.Navigation.QuickLaunch.Add(ci);
context.ExecuteQuery();

結果。赤枠の位置に追加されました。

位置指定なしで追加した場合は先頭に追加されるようです。

AsLastNode=true:最後に追加

NavigationNodeCreationInformation.AsLastNode property

AsLastNodeプロパティをtrueにするとリンクコレクションの最後に追加されます。

var web = context.Web;
var ci = new NavigationNodeCreationInformation()
{
    Title = "test_last",
    Url = "https://msdn.microsoft.com/ja-jp/default.aspx",
    AsLastNode = true
};
web.Navigation.QuickLaunch.Add(ci);
context.ExecuteQuery();

結果。実際には、サイトコンテンツの上(最後から2番目)に追加されました。

追加位置を指定:指定リンクの後に追加

最後に特定の位置にリンクを追加する方法です。既存のリンクを取得しておいて、NavigationNodeCreationInformation.PreviousNodeに取得したリンクを設定すると、そのリンクの後に追加されます。

ここでは、「ドキュメント」というリンクを取得しその次に追加しています。

// 既存のリンクを取得(このリンクの後に追加される)
var web = context.Web;
context.Load(web.Navigation.QuickLaunch);
context.ExecuteQuery();
var previousNode = web.Navigation
                      .QuickLaunch
                      .Where(node => node.Title == "ドキュメント")
                      .First();
var ci = new NavigationNodeCreationInformation()
{
 Title = "test_middle",
 Url = "https://msdn.microsoft.com/ja-jp/default.aspx",
 PreviousNode = previousNode
};
web.Navigation.QuickLaunch.Add(ci);
context.ExecuteQuery();

ドキュメントの次に追加されました。