SharePoint 2010中welcome page的设置细节

我在使用SharePoint 2010中遇到这样一个问题:我在Virsual Studio中自定义了一个页面,希望在FeatureActivated时使用我自定义页面作为首页,但是因为我在自定义页面中配置了一个webpart,这样导致如果feature重启,配置的webpart就会重复被添加到页面上。 因此我在FeatureDeactivating的时候删除自定义页面,并使用默认的SharePoint首页。但是在FeatureDeactivating中修改首页路径,然后删除自定义页面时就遇到了问题,有些环境能够正常运行,有些环境页面却会报错:

System.Web.HttpException: The DataSourceID of 'TopNavigationMenu' must be the ID of a control of type IHierarchicalDataSource.  A control with ID 'topSiteMap' could not be found.  
at System.Web.UI.WebControls.HierarchicalDataBoundControl.GetDataSource()   
at System.Web.UI.WebControls.HierarchicalDataBoundControl.ConnectToHierarchicalDataSource()   
at System.Web.UI.WebControls.HierarchicalDataBoundControl.OnLoad(EventArgs e)   
at System.Web.UI.Control.LoadRecursive()   
at System.Web.UI.Control.LoadRecursive()   
at System.Web.UI.Control.LoadRecursive()   
at System.Web.UI.Control.LoadRecursive()   
at System.Web.UI.Control.LoadRecursive()   
at System.Web.UI.Control.LoadRecursive()   
at System.Web.UI.Control.LoadRecursive()   
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

后来检查发现使用代码来设置home page的时候,还跟一个feature的启动情况有关,这个feature就是SharePoint Server Publishing Infrastructure,它的definitionId为:f6924d36-2fa8-4f0b-b16d-06b7250180fa

在FeatureActivated中,设置自定义页面时:

  public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPSite site = properties.Feature.Parent as SPSite;
            using (SPWeb web = site.OpenWeb())
            {
                SPFolder rootFolder = web.RootFolder;
                if (!rootFolder.WelcomePage.Equals("SitePages/myhome.aspx", StringComparison.CurrentCultureIgnoreCase))
                {
                    rootFolder.WelcomePage = "SitePages/myhome.aspx";
                    rootFolder.Update();
                }
            }
        }

但是FeatureDeactivating就需要根据feature是否启动进行不同的处理:

 

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            SPSite site = properties.Feature.Parent as SPSite;
            site.AllowUnsafeUpdates = true;
            using (SPWeb web = site.OpenWeb())
            {
                web.AllowUnsafeUpdates = true; 
//先判断SharePoint Server Publishing是否启动,如果启动则修改为默认的home page,如果没有启动则直接删除自定义的首页 bool isactive = this.IsActive(web, "94c94ca6-b32f-4da9-a9e3-1f3d343d7ecb"); if (isactive) { SPFolder folder = web.RootFolder; folder.WelcomePage = "SitePages/Home.aspx"; folder.Update(); } //删除自定义的首页 string url = web.Url + "/SitePages/myhome.aspx"; SPListItem listitem = web.GetListItem(url); if (listitem != null) { listitem.Delete(); } } }

判断feature是否启动是因为,如果feature已经启动,如果不先修改homepage ,在删除自定义首页的时候就会报如下错误:

ExceptionMessage: 'The item that you are trying to delete is the current welcome page and cannot be deleted.'  

但是如果feature没有启动,如果调用修改首页为默认home.aspx时代码虽然顺利通过,但是页面却会文章中的第一个错误,并且即使没有修改首页路径,直接调用删除自定义首页的代码时也不会报错。

希望这个关于首页设置的解决方法对遇到相同问题的同行们能提供帮助。

原文地址:https://www.cnblogs.com/snailJuan/p/2949724.html