チュートリアル: サーバー エクスプローラーを拡張して Web パーツを表示する
Visual Studio 2010 では、サーバー エクスプローラーの [SharePoint 接続] ノードを使用して、SharePoint サイトのコンポーネントを表示できます。 ただし、既定ではサーバー エクスプローラーに表示されないコンポーネントもいくつか存在します。 このチュートリアルでは、サーバー エクスプローラーを拡張し、接続されている各 SharePoint サイト上の Web パーツ ギャラリーを表示できるようにします。
このチュートリアルでは、次のタスクについて説明します。
サーバー エクスプローラーを拡張する Visual Studio 拡張機能を作成する。具体的には、次の点を拡張します。
サーバー エクスプローラーの各 SharePoint サイト ノードに新しい Web パーツ ギャラリー ノードを追加する。 この新しいノードには、サイト上の Web パーツ ギャラリー内の個々の Web パーツを表す子ノードが表示されます。
Web パーツのインスタンスを表す新しいノード型を定義する。 新しい Web パーツ ギャラリー ノードの子ノードには、このノード型が使用されます。 新しい Web パーツ ノード型が表す Web パーツについての情報は、[プロパティ] ウィンドウに表示されます。 ノード型には、Web パーツに関連した他のタスクの開始点となるカスタム ショートカット メニュー項目も含まれます。
拡張機能のアセンブリから呼び出される 2 つのカスタム SharePoint コマンドを作成する。 SharePoint コマンドは、SharePoint サーバー オブジェクト モデルの API を使用するために拡張機能のアセンブリから呼び出すことのできるメソッドです。 このチュートリアルでは、開発コンピューター上のローカル SharePoint サイトから Web パーツ情報が取得するコマンドを作成します。 詳細については、「SharePoint オブジェクト モデルの呼び出し」を参照してください。
拡張機能を配置するための Visual Studio Extension (VSIX) パッケージを構築する。
拡張機能をデバッグしてテストする。
注意
サーバー オブジェクト モデルの代わりに SharePoint クライアント オブジェクト モデルを使用する、このチュートリアルの代替バージョンについては、「チュートリアル: サーバー エクスプローラーの拡張機能から SharePoint クライアント オブジェクト モデルを呼び出す」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、開発コンピューターに次のコンポーネントが必要です。
サポート対象エディションの Microsoft Windows、SharePoint、および Visual Studio。 詳細については、「SharePoint ソリューションの開発要件」を参照してください。
Visual Studio 2010 SDK。 このチュートリアルでは、プロジェクト項目を配置するための VSIX パッケージを、SDK の VSIX プロジェクト テンプレートを使用して作成します。 詳細については、「Visual Studio の SharePoint ツールの拡張」を参照してください。
次の概念に関する知識があると役に立ちますが、チュートリアルを実行するうえで必須というわけではありません。
SharePoint サーバー オブジェクト モデルの使用。 詳細については、「Using the SharePoint Foundation Server-Side Object Model (SharePoint Foundation Server 側オブジェクト モデルの使用)」を参照してください。
SharePoint ソリューションの Web パーツ。 詳細については、「Web Parts Overview (Web パーツの概要)」を参照してください。
プロジェクトの作成
このチュートリアルを実行するには、3 つのプロジェクトを作成する必要があります。
拡張機能を配置するために VSIX パッケージを作成する VSIX プロジェクト。
プロジェクトの拡張機能を実装するクラス ライブラリ プロジェクト。 このプロジェクトは .NET Framework 4 を対象にする必要があります。
カスタムの SharePoint コマンドを定義するクラス ライブラリ プロジェクト。 このプロジェクトは .NET Framework 3.5 を対象にする必要があります。
この 2 つのプロジェクトを作成することから始めます。
VSIX プロジェクトを作成するには
Visual Studio を起動します。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスで、[Visual C#] ノードまたは [Visual Basic] ノードを展開し、[機能拡張] ノードを選択します。
注意
[機能拡張] ノードは、Visual Studio 2010 SDK がインストールされている場合にのみ使用できます。 詳細については、冒頭の「前提条件」を参照してください。
ダイアログ ボックス上部のコンボ ボックスで、[.NET Framework 4] をクリックします。
[VSIX プロジェクト] テンプレートを選択します。
[プロジェクト名] ボックスに「WebPartNode」と入力します。
[OK] をクリックします。
Visual Studio のソリューション エクスプローラーに WebPartNode プロジェクトが追加されます。
拡張機能プロジェクトを作成するには
ソリューション エクスプローラーでソリューション ノードを右クリックし、[追加] をクリックして、[新しいプロジェクト] をクリックします。
注意
Visual Basic プロジェクトでソリューション エクスプローラーにソリューション ノードが表示されるのは、[全般] ([オプション] ダイアログ ボックス - [プロジェクトおよびソリューション])の [常にソリューションを表示] チェック ボックスがオンになっている場合だけです。
[新しいプロジェクト] ダイアログ ボックスで、[Visual C#] ノードまたは [Visual Basic] ノードを展開し、[Windows] をクリックします。
ダイアログ ボックス上部のコンボ ボックスで、[.NET Framework 4] を選択します。
[クラス ライブラリ] プロジェクト テンプレートを選択します。
[名前] ボックスに「WebPartNodeExtension」と入力します。
[OK] をクリックします。
Visual Studio によって、WebPartNodeExtension プロジェクトがソリューションに追加され、既定の Class1 コード ファイルが開きます。
Class1 コード ファイルをプロジェクトから削除します。
SharePoint コマンド プロジェクトを作成するには
ソリューション エクスプローラーでソリューション ノードを右クリックし、[追加] をクリックして、[新しいプロジェクト] をクリックします。
注意
Visual Basic プロジェクトでソリューション エクスプローラーにソリューション ノードが表示されるのは、[全般] ([オプション] ダイアログ ボックス - [プロジェクトおよびソリューション])の [常にソリューションを表示] チェック ボックスがオンになっている場合だけです。
[新しいプロジェクト] ダイアログ ボックスで、[Visual C#] ノードまたは [Visual Basic] ノードを展開し、[Windows] をクリックします。
ダイアログ ボックス上部のコンボ ボックスで、[.NET Framework 3.5] を選択します。
[クラス ライブラリ] プロジェクト テンプレートを選択します。
[プロジェクト名] ボックスに「WebPartCommands」と入力します。
[OK] をクリックします。
Visual Studio によって、WebPartCommands プロジェクトがソリューションに追加され、既定の Class1 コード ファイルが開きます。
Class1 コード ファイルをプロジェクトから削除します。
プロジェクトの構成
拡張機能を作成するためのコードを記述する前に、コード ファイルおよびアセンブリ参照を追加し、プロジェクトの設定を構成しておく必要があります。
WebPartNodeExtension プロジェクトを構成するには
WebPartNodeExtension プロジェクトに、次の名前で 4 つのコード ファイルを追加します。
SiteNodeExtension
WebPartNodeTypeProvider
WebPartNodeInfo
WebPartCommandIds
[プロジェクト] メニューの [参照の追加] をクリックします。
[.NET] タブで、Ctrl キーを押しながら次のアセンブリを選択し、[OK] をクリックします。
Microsoft.VisualStudio.SharePoint
System.ComponentModel.Composition
System.Windows.Forms
ソリューション エクスプローラーで、[WebPartNodeExtension] プロジェクト ノードを右クリックし、[プロパティ] をクリックします。
プロジェクト デザイナーが開きます。
[アプリケーション] タブをクリックします。
[既定の名前空間] ボックス (C#) または [ルート名前空間] ボックス (Visual Basic) に、「ServerExplorer.SharePointConnections.WebPartNode」と入力します。
WebPartCommands プロジェクトを構成するには
WebPartCommands プロジェクトで、WebPartCommands という名前のコード ファイルを追加します。
ソリューション エクスプローラーで、[WebPartCommands] プロジェクト ノードを選択します。
[プロジェクト] メニューの [既存項目の追加] をクリックします。
[既存項目の追加] ダイアログ ボックスで、WebPartNodeExtension プロジェクトのコード ファイルが格納されているフォルダーを参照します。
WebPartNodeInfo および WebPartCommandIds のコード ファイルを選択します。
[追加] ボタンのドロップダウン メニューをクリックし、[リンクとして追加] を選択します。
Visual Studio により、WebPartCommands プロジェクトにリンクとしてコード ファイルが追加されます。 つまり、コード ファイルそのものは WebPartNodeExtension プロジェクトに存在しますが、そのファイル内のコードは WebPartNode プロジェクトだけでなく、WebPartCommands プロジェクトでもコンパイルされる、ということです。
[プロジェクト] メニューの [参照の追加] をクリックします。
[.NET] タブで、Ctrl キーを押しながら次のアセンブリを選択し、[OK] をクリックします。
Microsoft.SharePoint
Microsoft.VisualStudio.SharePoint.Commands
ソリューション エクスプローラーで、[WebPartCommands] プロジェクト ノードを右クリックし、[プロパティ] をクリックします。
プロジェクト デザイナーが開きます。
[アプリケーション] タブをクリックします。
[既定の名前空間] ボックス (C#) または [ルート名前空間] ボックス (Visual Basic) に、「ServerExplorer.SharePointConnections.WebPartNode」と入力します。
新しいノードのアイコンの作成
サーバー エクスプローラーの拡張機能に対して 2 つのアイコンを作成します。新しい Web パーツ ギャラリー ノードのアイコンと、Web パーツ ギャラリー ノード下に存在するそれぞれの子 Web パーツ ノードのアイコンです。 これらのアイコンをノードに関連付けるコードは後で作成します。
ノードのアイコンを作成するには
ソリューション エクスプローラーで、[WebPartNodeExtension] プロジェクト ノードを右クリックし、[プロパティ] をクリックします。
[プロジェクト] メニューの [WebPartNodeExtension プロパティ] を選択します。
プロジェクト デザイナーが開きます。
[リソース] タブをクリックします。
[このプロジェクトには既定のリソース ファイルが含まれていません。 ファイルを作成するには、ここをクリックしてください。] をクリックします。
Visual Studio によってリソース ファイルが作成され、デザイナーに表示されます。
デザイナーの一番上にある [追加] ボタンのドロップダウン矢印をクリックし、[新しいアイコンの追加] をクリックします。
新しいアイコン名として「WebPartsNode」と入力し、[追加] をクリックします。
イメージ エディターに新しいアイコンが表示されます。
認識しやすいデザインとなるよう 16x16 版のアイコン ファイルを編集します。
32x32 版のアイコンを選択します。
[イメージ] メニューの [イメージ タイプの削除] をクリックします。
手順 5. ~ 9. を繰り返して、もう 1 つのアイコンをプロジェクト リソースに追加します。 このアイコンには「WebPart」という名前を付けます。
ソリューション エクスプローラーで、 WebPartNodeExtension プロジェクトの Resources フォルダーにある [WebPartsNode.ico] を選択します。
[プロパティ] ウィンドウで、[ビルド アクション] の横のドロップダウンをクリックし、[埋め込まれたリソース] を選択します。
WebPart.ico について最後の 2 つの手順を繰り返します。
サーバー エクスプローラーへの Web パーツ ギャラリー ノードの追加
各 SharePoint サイト ノードに新しい Web パーツ ギャラリー ノードを追加するクラスを作成します。 新しいノードを追加するため、このクラスに IExplorerNodeTypeExtension インターフェイスを実装します。 サーバー エクスプローラーの既存のノードの動作を拡張 (ノードに新しい子ノードを追加するなど) する場合は必ず、このインターフェイスを実装します。
サーバー エクスプローラーに Web パーツ ギャラリー ノードを追加するには
WebPartNodeExtension プロジェクトで、SiteNodeExtension コード ファイルをダブルクリックします。
このファイルに次のコードを貼り付けます。
注意
このコードを追加した直後は、いくつかのコンパイル エラーが発生します。 これらのエラーは、この後の手順でコードを追加すると解消されます。
Imports System.Collections.Generic Imports System.ComponentModel.Composition Imports Microsoft.VisualStudio.SharePoint.Explorer Namespace ServerExplorer.SharePointConnections.WebPartNode ' Export attribute: Enables Visual Studio to discover and load this extension. ' ExplorerNodeType attribute: Indicates that this class extends SharePoint site nodes in Server Explorer. ' WebPartNodeTypeProvider class: Represents an extension of SharePoint site nodes in Server Explorer. <Export(GetType(IExplorerNodeTypeExtension))> _ <ExplorerNodeType(ExplorerNodeTypes.SiteNode)> _ Friend Class SiteNodeExtension Implements IExplorerNodeTypeExtension Private Sub Initialize(ByVal nodeType As IExplorerNodeType) _ Implements IExplorerNodeTypeExtension.Initialize ' The NodeChildrenRequested event is raised when the user expands the ' SharePoint site node in Server Explorer. AddHandler nodeType.NodeChildrenRequested, AddressOf NodeChildrenRequested End Sub ' Creates the new Web Part Gallery node with the specified icon. Private Sub NodeChildrenRequested(ByVal Sender As Object, ByVal e As ExplorerNodeEventArgs) ' The CreateWebPartNodes argument is a delegate that Visual Studio calls ' to create the child nodes under the Web Part Gallery node. e.Node.ChildNodes.AddFolder("Web Part Gallery", My.Resources.WebPartsNode.ToBitmap(), _ AddressOf CreateWebPartNodes) End Sub ' Creates all of the individual Web Part nodes under the new Web Part Gallery node. Private Sub CreateWebPartNodes(ByVal parentNode As IExplorerNode) ' Call the custom SharePoint command to get items from the Web Part gallery. Dim webParts = parentNode.Context.SharePointConnection.ExecuteCommand(Of WebPartNodeInfo())( _ WebPartCommandIds.GetWebParts) If webParts IsNot Nothing Then For Each webPart As WebPartNodeInfo In webParts ' Create a new annotation object to store the current Web Part item with the new node. Dim annotations = New Dictionary(Of Object, Object)() annotations.Add(GetType(WebPartNodeInfo), webPart) ' Create the new node for the current Web Part item. parentNode.ChildNodes.Add(WebPartNodeTypeProvider.WebPartNodeTypeId, _ webPart.Name, annotations) Next End If End Sub End Class End Namespace
using System.Collections.Generic; using System.ComponentModel.Composition; using Microsoft.VisualStudio.SharePoint.Explorer; namespace ServerExplorer.SharePointConnections.WebPartNode { // Enables Visual Studio to discover and load this extension. [Export(typeof(IExplorerNodeTypeExtension))] // Indicates that this class extends SharePoint site nodes in Server Explorer. [ExplorerNodeType(ExplorerNodeTypes.SiteNode)] // Represents an extension of SharePoint site nodes in Server Explorer. internal class SiteNodeExtension : IExplorerNodeTypeExtension { public void Initialize(IExplorerNodeType nodeType) { // The NodeChildrenRequested event is raised when the user expands the // SharePoint site node in Server Explorer. nodeType.NodeChildrenRequested += NodeChildrenRequested; } // Creates the new Web Part Gallery node with the specified icon. private void NodeChildrenRequested(object sender, ExplorerNodeEventArgs e) { // The CreateWebPartNodes argument is a delegate that Visual Studio calls // to create the child nodes under the Web Part Gallery node. e.Node.ChildNodes.AddFolder("Web Part Gallery", Properties.Resources.WebPartsNode.ToBitmap(), CreateWebPartNodes); } // Creates all of the individual Web Part nodes under the new Web Part Gallery node. private void CreateWebPartNodes(IExplorerNode parentNode) { // Call the custom SharePoint command to get items from the Web Part gallery. var webParts = parentNode.Context.SharePointConnection.ExecuteCommand<WebPartNodeInfo[]>( WebPartCommandIds.GetWebParts); if (webParts != null) { foreach (WebPartNodeInfo webPart in webParts) { // Create a new annotation object to store the current Web Part item with the new node. var annotations = new Dictionary<object, object>() { { typeof(WebPartNodeInfo), webPart } }; // Create the new node for the current Web Part item. parentNode.ChildNodes.Add(WebPartNodeTypeProvider.WebPartNodeTypeId, webPart.Name, annotations); } } } } }
Web パーツを表すノード型の定義
Web パーツを表す新しいノード型を定義したクラスを作成します。 Visual Studio は、この新しいノード型を使用して、Web パーツ ギャラリー ノードの子ノードを表示します。 それぞれの子ノードは、SharePoint サイト上の単一の Web パーツを表します。
新しいノード型を定義するため、このクラスに IExplorerNodeTypeProvider インターフェイスを実装します。 このインターフェイスは、サーバー エクスプローラーに新しい種類のノードを定義する場合に必ず実装します。
Web パーツ ノード型を定義するには
WebPartNodeExtension プロジェクトで、WebPartNodeTypeProvder コード ファイルをダブルクリックします。
このファイルに次のコードを貼り付けます。
Imports System Imports System.Collections.Generic Imports System.Windows.Forms Imports System.ComponentModel.Composition Imports Microsoft.VisualStudio.SharePoint Imports Microsoft.VisualStudio.SharePoint.Explorer Namespace ServerExplorer.SharePointConnections.WebPartNode ' Export attribute: Enables Visual Studio to discover and load this extension. ' ExplorerNodeType attribute: Specifies the ID for this new node type. ' WebPartNodeTypeProvider class: Defines a new node type that represents a Web Part on a SharePoint site. <Export(GetType(IExplorerNodeTypeProvider))> _ <ExplorerNodeType(WebPartNodeTypeProvider.WebPartNodeTypeId)> _ Friend Class WebPartNodeTypeProvider Implements IExplorerNodeTypeProvider Friend Const WebPartNodeTypeId As String = "Contoso.WebPart" Private Sub InitializeType(ByVal typeDefinition As IExplorerNodeTypeDefinition) _ Implements IExplorerNodeTypeProvider.InitializeType typeDefinition.DefaultIcon = My.Resources.WebPart.ToBitmap() typeDefinition.IsAlwaysLeaf = True AddHandler typeDefinition.NodePropertiesRequested, AddressOf NodePropertiesRequested End Sub ' Retrieves properties that are displayed in the Properties window when ' a Web Part node is selected. Private Sub NodePropertiesRequested(ByVal Sernder As Object, _ ByVal e As ExplorerNodePropertiesRequestedEventArgs) Dim nodeInfo = e.Node.Annotations.GetValue(Of WebPartNodeInfo)() ' Call the custom SharePoint command to get the Web Part properties. Dim properties As Dictionary(Of String, String) = _ e.Node.Context.SharePointConnection.ExecuteCommand( _ Of WebPartNodeInfo, Dictionary(Of String, String))( WebPartCommandIds.GetWebPartProperties, nodeInfo) Dim propertySource As Object = e.Node.Context.CreatePropertySourceObject(properties) e.PropertySources.Add(propertySource) End Sub End Class End Namespace
using System; using System.Collections.Generic; using System.Windows.Forms; using System.ComponentModel.Composition; using Microsoft.VisualStudio.SharePoint; using Microsoft.VisualStudio.SharePoint.Explorer; namespace ServerExplorer.SharePointConnections.WebPartNode { // Enables Visual Studio to discover and load this extension. [Export(typeof(IExplorerNodeTypeProvider))] // Specifies the ID for this new node type. [ExplorerNodeType(WebPartNodeTypeProvider.WebPartNodeTypeId)] // Defines a new node type that represents a Web Part on a SharePoint site. internal class WebPartNodeTypeProvider : IExplorerNodeTypeProvider { internal const string WebPartNodeTypeId = "Contoso.WebPart"; public void InitializeType(IExplorerNodeTypeDefinition typeDefinition) { typeDefinition.DefaultIcon = Properties.Resources.WebPart.ToBitmap(); typeDefinition.IsAlwaysLeaf = true; typeDefinition.NodePropertiesRequested += NodePropertiesRequested; } // Retrieves properties that are displayed in the Properties window when // a Web Part node is selected. private void NodePropertiesRequested(object sender, ExplorerNodePropertiesRequestedEventArgs e) { var webPartNodeInfo = e.Node.Annotations.GetValue<WebPartNodeInfo>(); // Call the custom SharePoint command to get the Web Part properties. Dictionary<string, string> properties = e.Node.Context.SharePointConnection.ExecuteCommand< WebPartNodeInfo, Dictionary<string, string>>( WebPartCommandIds.GetWebPartProperties, webPartNodeInfo); object propertySource = e.Node.Context.CreatePropertySourceObject(properties); e.PropertySources.Add(propertySource); } } }
Web パーツ データ クラスの定義
SharePoint サイト上の単一の Web パーツについてのデータを格納するクラスを定義します。 サイト上の個々の Web パーツに関するデータを取得し、そのデータをこのクラスのインスタンスに割り当てることになりますが、そのためのカスタム SharePoint コマンドは後で作成します。
Web パーツ データ クラスを定義するには
WebPartNodeExtension プロジェクトで、WebPartNodeInfo コード ファイルをダブルクリックします。
このファイルに次のコードを貼り付けます。
Imports System Namespace ServerExplorer.SharePointConnections.WebPartNode ' Contains basic data about a single Web Part on the SharePoint site. This class is ' serializable so that instances of it can be sent between the WebPartNode and ' WebPartCommands assemblies. <Serializable()> _ Public Class WebPartNodeInfo Private siteIdValue As Guid Public Property SiteId As Guid Get Return siteIdValue End Get Set(ByVal value As Guid) siteIdValue = value End Set End Property Private idValue As Integer Public Property Id As Integer Get Return idValue End Get Set(ByVal value As Integer) idValue = value End Set End Property Private uniqueIdValue As Guid Public Property UniqueId As Guid Get Return uniqueIdValue End Get Set(ByVal value As Guid) uniqueIdValue = value End Set End Property Private nameValue As String Public Property Name As String Get Return nameValue End Get Set(ByVal value As String) nameValue = value End Set End Property Private imageUrlValue As String Public Property ImageUrl As String Get Return imageUrlValue End Get Set(ByVal value As String) imageUrlValue = value End Set End Property End Class End Namespace
using System; namespace ServerExplorer.SharePointConnections.WebPartNode { // Contains basic data about a single Web Part on the SharePoint site. This class is // serializable so that instances of it can be sent between the WebPartNode and // WebPartCommands assemblies. [Serializable] public class WebPartNodeInfo { public Guid SiteId { get; set; } public int Id { get; set; } public Guid UniqueId { get; set; } public string Name { get; set; } public string ImageUrl { get; set; } } }
SharePoint コマンドに対する ID の定義
カスタム SharePoint コマンドを識別する文字列をいくつか定義します。 これらのコマンドについては、このチュートリアルの後半で実装します。
コマンドの ID を定義するには
WebPartNodeExtension プロジェクトで、WebPartCommandIds コード ファイルをダブルクリックします。
このファイルに次のコードを貼り付けます。
Namespace ServerExplorer.SharePointConnections.WebPartNode Public Class WebPartCommandIds Public Const GetWebParts As String = "WebPart.GetWebParts" Public Const GetWebPartProperties As String = "WebPart.GetProperties" End Class End Namespace
namespace ServerExplorer.SharePointConnections.WebPartNode { public static class WebPartCommandIds { public const string GetWebParts = "WebPart.GetWebParts"; public const string GetWebPartProperties = "WebPart.GetProperties"; } }
カスタム SharePoint コマンドの作成
SharePoint サーバー オブジェクト モデルを呼び出して SharePoint サイト上の Web パーツに関するデータを取得するカスタム コマンドを作成します。 どちらのコマンドも、SharePointCommandAttribute が適用されたメソッドです。
SharePoint コマンドを定義するには
WebPartCommands プロジェクトで、WebPartCommands コード ファイルをダブルクリックします。
このファイルに次のコードを貼り付けます。
Imports System.Collections.Generic Imports Microsoft.SharePoint Imports Microsoft.VisualStudio.SharePoint.Commands Namespace ServerExplorer.SharePointConnections.WebPartNode Friend Class WebPartsCommands ' Gets data for each Web Part on the SharePoint site, and returns an array of ' serializable objects that contain the data. <SharePointCommand(WebPartCommandIds.GetWebParts)> _ Private Shared Function GetWebParts(ByVal context As ISharePointCommandContext) As WebPartNodeInfo() Dim nodeInfos = New List(Of WebPartNodeInfo)() Dim webParts As SPListItemCollection = context.Site.GetCatalog( _ SPListTemplateType.WebPartCatalog).Items For Each webPart As SPListItem In webParts Dim nodeInfo As WebPartNodeInfo = New WebPartNodeInfo() With nodeInfo .Id = webPart.ID .SiteId = webPart.ParentList.ParentWeb.ID .Name = webPart.Title .UniqueId = webPart.UniqueId .ImageUrl = webPart.ParentList.ImageUrl End With nodeInfos.Add(nodeInfo) Next Return nodeInfos.ToArray() End Function ' Gets additional property data for a specific Web Part. <SharePointCommand(WebPartCommandIds.GetWebPartProperties)> _ Private Shared Function GetWebPartProperties(ByVal context As ISharePointCommandContext, _ ByVal webPartNodeInfo As WebPartNodeInfo) As Dictionary(Of String, String) Dim webParts As SPList = context.Site.GetCatalog(SPListTemplateType.WebPartCatalog) Dim webPart As SPListItem = webParts.Items(webPartNodeInfo.UniqueId) Return SharePointCommandServices.GetProperties(webPart) End Function End Class End Namespace
using System.Collections.Generic; using Microsoft.SharePoint; using Microsoft.VisualStudio.SharePoint.Commands; namespace ServerExplorer.SharePointConnections.WebPartNode { internal class WebPartsCommands { // Gets data for each Web Part on the SharePoint site, and returns an array of // serializable objects that contain the data. [SharePointCommand(WebPartCommandIds.GetWebParts)] private static WebPartNodeInfo[] GetWebParts(ISharePointCommandContext context) { var nodeInfos = new List<WebPartNodeInfo>(); SPListItemCollection webParts = context.Site.GetCatalog( SPListTemplateType.WebPartCatalog).Items; foreach (SPListItem webPart in webParts) { WebPartNodeInfo nodeInfo = new WebPartNodeInfo { Id = webPart.ID, SiteId = webPart.ParentList.ParentWeb.ID, Name = webPart.Title, UniqueId = webPart.UniqueId, ImageUrl = webPart.ParentList.ImageUrl }; nodeInfos.Add(nodeInfo); } return nodeInfos.ToArray(); } // Gets additional property data for a specific Web Part. [SharePointCommand(WebPartCommandIds.GetWebPartProperties)] private static Dictionary<string, string> GetWebPartProperties(ISharePointCommandContext context, WebPartNodeInfo nodeInfo) { SPList webParts = context.Site.GetCatalog(SPListTemplateType.WebPartCatalog); SPListItem webPart = webParts.Items[nodeInfo.UniqueId]; return SharePointCommandServices.GetProperties(webPart); } } }
チェックポイント
この段階で、Web パーツ ギャラリー ノードおよび SharePoint コマンドに必要なすべてのコードがプロジェクトに揃ったことになります。 エラーが発生することなく 2 つのプロジェクトをコンパイルできるかどうか、ソリューションをビルドして確認してください。
ソリューションをビルドするには
- [ビルド] メニューの [ソリューションのビルド] をクリックします。
拡張機能を配置するための VSIX パッケージの作成
拡張機能を配置するには、ソリューションで VSIX プロジェクトを使用して VSIX パッケージを作成します。 まず、VSIX プロジェクトに含まれている source.extension.vsixmanifest ファイルを変更して、VSIX パッケージを構成します。 次に、ソリューションをビルドして VSIX パッケージを作成します。
VSIX パッケージを構成するには
ソリューション エクスプローラーで、WebPartNode プロジェクトの source.extension.vsixmanifest ファイルをダブルクリックします。
Visual Studio によってマニフェスト エディターでファイルが開きます。 source.extension.vsixmanifest ファイルが、すべての VSIX パッケージで必要とされる extension.vsixmanifest ファイルの基礎となります。 このファイルの詳細については、「VSIX Extension Schema Reference」を参照してください。
[製品名] ボックスに「Web Part Gallery Node for Server Explorer」と入力します。
[作成者] ボックスに「Contoso」と入力します。
[説明] ボックスに「Adds a custom Web Part Gallery node to the SharePoint Connections node in Server Explorer. This extension uses a custom SharePoint command to call into the server object model.」と入力します。
エディターの [コンテンツ] セクションで、[コンテンツの追加] をクリックします。
[コンテンツの追加] ダイアログ ボックスで、[コンテンツ タイプの選択] ボックスの一覧の [MEF コンポーネント] をクリックします。
注意
この値は、extension.vsixmanifest ファイル内の MefComponent 要素に対応します。 この要素は、VSIX パッケージ内の拡張機能アセンブリの名前を指定します。 詳細については、「MEFComponent Element (VSX Schema)」を参照してください。
[ソースの選択] の下にある [プロジェクト] をクリックし、その横のリスト ボックスの [WebPartNodeExtension] を選択します。
[OK] をクリックします。
マニフェスト エディターの [コンテンツの追加] をもう一度クリックします。
[コンテンツの追加] ダイアログ ボックスで、[コンテンツの種類の選択] リスト ボックスの [カスタム拡張機能の種類] をクリックします。
注意
この値は、extension.vsixmanifest ファイル内の CustomExtension 要素に対応します。 Visual Studio の拡張機能に追加するカスタム拡張機能は、この要素によって指定されます。 詳細については、「CustomExtension Element (VSX Schema)」を参照してください。
[種類] ボックスに「SharePoint.Commands.v4」と入力します。
注意
この値は、extension.vsixmanifest ファイル内の CustomExtension 要素の Type 属性に対応します。 カスタム SharePoint コマンドを含んでいるすべてのカスタム拡張機能アセンブリには、Sharepoint.Commands.v4 の値が必須です。
[ソースの選択] の下にある [プロジェクト] をクリックし、その横のリスト ボックスの [WebPartCommands] を選択します。
[OK] をクリックします。
[ビルド] メニューの [ソリューションのビルド] をクリックします。 エラーが発生することなくソリューションがコンパイルされることを確認します。
WebPartNode プロジェクトのビルド出力フォルダーを開きます。 このフォルダーに WebPartNode.vsix ファイルが格納されていることを確認します。
既定では、プロジェクト ファイルに格納されているフォルダー の ..\bin\Debug フォルダーがビルド出力フォルダーです。
拡張機能のテスト
これで、サーバー エクスプローラーの新しい Web パーツ ギャラリー ノードをテストする準備ができました。 まず、Visual Studio の実験用インスタンスで拡張機能のデバッグを開始します。 次に、Visual Studio の実験用インスタンスで新しい [Web パーツ] ノードを使用します。
拡張機能のデバッグを開始するには
管理者特権で Visual Studio を再起動し、WebPartNode ソリューションを開きます。
WebPartNodeExtension プロジェクトで、SiteNodeExtension コード ファイルを開き、NodeChildrenRequested メソッドおよび CreateWebPartNodes メソッド内の最初のコード行にブレークポイントを追加します。
F5 キーを押してデバッグを開始します。
Visual Studio によって、拡張機能が %UserProfile%\AppData\Local\Microsoft\VisualStudio\10.0Exp\Extensions\Contoso\Web Part Gallery Node Extension for Server Explorer\1.0 にインストールされ、Visual Studio の実験用インスタンスが開始されます。 このインスタンスの Visual Studio でプロジェクト項目をテストします。
拡張機能をテストするには
Visual Studio の実験用インスタンスの [表示] メニューで [サーバー エクスプローラー] をクリックします。
テストに使用する SharePoint サイトが、サーバー エクスプローラーの [SharePoint 接続] ノードに表示されていることを確認します。 表示されない場合は、次の手順を実行します。
[SharePoint 接続] を右クリックし、[接続の追加] をクリックします。
[SharePoint 接続の追加] ダイアログ ボックスで、接続先の SharePoint サイトの URL を入力します。 開発コンピューター上の SharePoint サイトを指定するには、「https://localhost」と入力します。
[OK] をクリックします。
サイト接続ノード (サイトの URL を表示するノード) を展開し、子サイト ノード (チーム サイトなど) を展開します。
Visual Studio のもう一方のインスタンスで、先ほど NodeChildrenRequested メソッドに設定したブレークポイントで、コードが停止していることを確認します。 F5 キーを押して、プロジェクトのデバッグを続行します。
Visual Studio の実験用インスタンスで、[Web パーツ ギャラリー] という新しいノードがトップ レベルのサイト ノードの下に表示されます。 [Web パーツ ギャラリー] ノードを展開します。
Visual Studio のもう一方のインスタンスで、先ほど CreateWebPartNodes メソッドに設定したブレークポイントで、コードが停止していることを確認します。 F5 キーを押して、プロジェクトのデバッグを続行します。
Visual Studio の実験用インスタンスで、サーバー エクスプローラーの [Web パーツ ギャラリー] ノードに、接続先サイトのすべての Web パーツが表示されていることを確認します。
いずれかの Web パーツを右クリックして、[プロパティ] をクリックします。
デバッグ中の Visual Studio インスタンスで、Web パーツに関する詳細な情報が [プロパティ] ウィンドウに表示されることを確認します。
Visual Studio からの拡張機能のアンインストール
拡張機能のテストが完了したら、拡張機能を Visual Studio からアンインストールします。
拡張機能をアンインストールするには
Visual Studio の実験用インスタンスの [ツール] メニューで、[拡張機能マネージャー] をクリックします。
[拡張機能マネージャー] ダイアログ ボックスが表示されます。
拡張機能の一覧で、[Web Part Gallery Node Extension for Server Explorer] を選択し、[アンインストール] をクリックします。
確認のダイアログ ボックスが表示されたら、[はい] をクリックして、拡張機能をアンインストールします。
[今すぐ再起動] をクリックするとアンインストールは完了です。
Visual Studio の両方のインスタンス (WebPartNode ソリューションを開いた Visual Studio の実験用インスタンスとインスタンス) を閉じます。
参照
処理手順
チュートリアル: サーバー エクスプローラーの拡張機能から SharePoint クライアント オブジェクト モデルを呼び出す