暢談Visual Studio 2010中的SharePoint插件
Visual Studio 2010***的賣點就是可擴展性。這樣就可以借助.NET社區的力量基于VS構建出許多有用的工具。本文中我們將展示如何擴展VS2010的服務器資源管理器,在其中的SharePoint結點上添加一個自定義操作。
SharePoint服務器資源管理器是Visual Studio 2010的一項新特性,該功能是由Visual Studio Tools for SharePoint提供的。
如果你只需要從Visual Studio中瀏覽SharePoint站點里的內容(網站欄,內容類型,功能等),那么默認功能對你來說就已經非常好用了。 然而,在默認情況下,SharePoint服務器資源管理器除了可以顯示網站里有哪些可用的內容以外,其它什么也做不了。
正如你所看到的,上下文菜單中僅有很少的幾項。下圖是通知列表的屬性面板。 該屬性存儲在Annotations中。為了方便理解什么是Annotation,你可以把它們想象成一個帶屬性的類。這些屬性就是我們在下面的屬性面板中看到的:
這里還是只讀的。
我可以擴展嗎?
接下來你一定會問這樣一個問題(如果你是一名SharePoint開發人員的話)——我能不能對其進行擴展,向SharePoint服務器資源管理器中添加自定義的命令或結點呢?
答案是肯定的。你可以擴展SharePoint服務器資源管理器,包括:
1)創建新結點
2)擴展已有結點
給我個例子好嗎?
讓我們以功能結點為例。
功能結點下顯示了該網站下所有已激活的功能。如果右擊某個功能,你會看到少得可憐的幾項。
如果能在上下文菜單中添加一項“停用”,點擊可以停用選中的功能,那就太帥了:)
[順帶說一句,這張截圖是實實在在的做好的擴展,而非Photoshop出來的:)]
理解SharePoint服務器資源管理器
在正式開始編寫一個擴展之前,你必須了解一下SharePoint服務器資源滾利器中不同類型的結點:
本例中我們感興趣的是FeatureNode。
開始
MSDN上有一篇非常棒的文章介紹了如何擴展Visual Studio Tools for SharePoint
下圖是我們將要進行的工作的圖形化表示:
1、新建一個類,并實現IExplorerNodeTypeExtension接口
2、處理事件
3、通過Annotations 訪問該結點的屬性
4、通過客戶端對象模型執行SharePoint操作
***步
創建一個Windows類庫項目并添加下列引用
第二步
創建一個類并實現接口IExplorerNodeTypeExtension:
第三步
我們感興趣的是在上下文菜單中添加一項,處理事件NodeMenuItemsRequested。這些都在Initialize方法中完成:
- public void Initialize(IExplorerNodeType nodeType)
- {
- nodeType.NodeMenuItemsRequested +=
- new EventHandler<ExplorerNodeMenuItemsRequestedEventArgs>
- (nodeType_NodeMenuItemsRequested);
- }
在下面添加事件處理程序:
- void nodeType_NodeMenuItemsRequested(object sender, ExplorerNodeMenuItemsRequestedEventArgs e)
- {
- IMenuItem deactivateMenu = e.MenuItems.Add("停用");
- deactivateMenu.Click +=
- new EventHandler<MenuItemEventArgs>(deactivateMenu_Click);
- }
我們在事件處理程序中添加了一個菜單項并且處理了其自身的點擊事件。
第四步
我們若要停用一個功能,首先需要知道該功能的Definition Id。在功能的屬性面板中已經有這個值了:
為了訪問該屬性,我們需要借助于Annotations對象。下面是訪問功能屬性的代碼:
- IFeatureNodeInfo fn = e.Node.Annotations[typeof(IFeatureNodeInfo)] as IFeatureNodeInfo;
- definitionId = fn.Id;
- featureName = fn.Name;
接下來我們要獲取該功能所處的網站。因為服務器資源管理器已經實例化了到該站點的連接,因此我們可以直接從當前上下文中獲取。
- IExplorerNodeContext siteContext = e.Node.Context;
下面是事件處理程序代碼現在的樣子:
- void nodeType_NodeMenuItemsRequested(object sender, ExplorerNodeMenuItemsRequestedEventArgs e)
- {
- siteContext = e.Node.Context;
- IFeatureNodeInfo fn = e.Node.Annotations[typeof(IFeatureNodeInfo)] as IFeatureNodeInfo;
- definitionId = fn.Id;
- featureName = fn.Name;
- IMenuItem deactivateMenu = e.MenuItems.Add("停用");
- deactivateMenu.Click += new EventHandler<MenuItemEventArgs>(deactivateMenu_Click);
- }
第五步
現在我們可以通過客戶端對象模型在新菜單項的事件處理程序中編寫停用功能的代碼了:
- void deactivateMenu_Click(object sender, MenuItemEventArgs e)
- {
- if (MessageBox.Show(confirmationMessage,String.Format("停用{0} 功能",featureName),
- MessageBoxButtons.YesNo,
- MessageBoxIcon.Exclamation) == DialogResult.Yes)
- {
- IExplorerNode parentFeatureNode = e.Owner as IExplorerNode;
- IExplorerNode featureNode = parentFeatureNode.ParentNode;
- ClientContext clientContext = new ClientContext(siteContext.SiteUrl.AbsoluteUri);
- Web site = clientContext.Web;
- FeatureCollection siteFeatures = site.Features;
- clientContext.Load(site, s => s.Title, s => s.Features);
- siteFeatures.Remove(definitionId, false);
- clientContext.ExecuteQuery();
- clientContext.Dispose();
- featureNode.Refresh();
- }
- }
確實很簡單。查詢并僅返回Web和Features對象,然后從該站點中Remove(停用)該功能。
你也可以通過客戶端對象模型的異步模式來實現異步調用。
部署該擴展
為了能夠部署這個擴展,我們需要將其包含到一個.vsix包中。
你可以套用VSIX模板來創建.vsix包。
在manifest文件中包含該擴展。
選擇內容為MEF Component,并選擇擴展項目作為源。
編譯該項目并生成相應的.vsix包,然后安裝這個包。
為FeatureNode所開發的“停用擴展”就完成了
現在看看上下文菜單,已經出現我們的菜單項了:
當你點擊它時,會彈出確認消息:
點"是"的話將停用該功能并刷新功能結點樹視圖。