使用代码管理SharePoint页面中的WebPart
SharePoint中的WebPart功能很强大,通过界面可以定制共享视图中的WebPart也可以定制个性化视图中的WebPart。
但是有的SharePoint项目可能需要通过feature向SharePoint的页面中添加WebPart,下面介绍如何实现通过代码管理SharePoint页面中的WebPart。
方案:通过SPSite->SPWeb->SPFolder得到SPFile,通过 SPFile.GetLimitedWebPartManager 方法获取SPWebPartManager(Provides a limited set of Web Part operations that can be performed in our object model scenarios when there is no HttpContext and no Page object is instantiated.),通过SPWebPartManager来操作页面中的WebPart,下面是示例代码:
//get the current web; not using "using" because we don't want to
//kill the web context for other controls that need it
SPWeb curWeb = SPContext.Current.Web;
//look to see if our code has already run
if (! curWeb.Properties.ContainsKey(KEY_CHK))
The next thing is to get a reference to the home page in the site:
//look for the default page so we can mess with the web parts
SPFile thePage = curWeb.RootFolder.Files["default.aspx"];
With the home page, you can get the web part manager for it:
//get the web part manager
SPLimitedWebPartManager theMan = thePage.GetLimitedWebPartManager
(System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);
//create a hashtable to store our web parts
hshWp = new Hashtable();
foreach (WebPart wp in theMan.WebParts)
{
//close the welcome part; WebPartAction is a custom class
//I wrote to keep track of web parts and their properties
if (wp.GetType().Equals(typeof(PersonalWelcomeWebPart)))
hshWp.Add(wp.StorageKey.ToString(),
new WebPartAction(wp,
WebPartAction.ActionType.Delete));
//etc
}
//add a new ThisWeekInPictures web part
ThisWeekInPicturesWebPart wpPix = new ThisWeekInPicturesWebPart();
wpPix.ImageLibrary = "Shared Pictures";
wpPix.Title = "My Pictures";
//add it to the hash so it gets put in the page
hshWp.Add(Guid.NewGuid().ToString(),
new WebPartAction(wpPix, WebPartAction.ActionType.Add,
"MiddleRightZone", 10));
Finally, the code enumerates through the hashtable and makes all of the web part changes:
foreach (string key in hshWp.Keys)
{
WebPartAction wpa = (WebPartAction)hshWp[key];
switch (wpa.Action)
{
case WebPartAction.ActionType.Delete:
theMan.DeleteWebPart(wpa.wp);
break;
case WebPartAction.ActionType.Move:
theMan.MoveWebPart(wpa.wp, wpa.zoneID, wpa.zoneIndex);
theMan.SaveChanges(wpa.wp);
break;
case WebPartAction.ActionType.Add:
theMan.AddWebPart(wpa.wp, wpa.zoneID, wpa.zoneIndex);
break;
}
}
//look to see if our code has already run
if (! curWeb.Properties.ContainsKey(KEY_CHK))
//add our key to the property bag so we don't run
//our provisioning code again
curWeb.Properties.Add(KEY_CHK, "true");
curWeb.Properties.Update();
curWeb.AllowUnsafeUpdates = false;