0

我最近在尝试Microsoft.SharePoint.Publishing.PublishingWeb从子站点中的自定义布局页面获取发布站点 ( ) 中的所有页面布局时遇到了这个错误。该代码使用从 Enterprise Wiki 站点模板创建的站点在 VM 服务器上运行。但是在开发服务器上运行时,代码遇到了各种异常。

为了解决这个错误,我用三种不同的方式编写了这个类。这三个都在 VM 中工作,但是在开发服务器中使用时,这三个都抛出了异常。例子:

private PageLayout FindPageLayout(PublishingWeb pubWeb, string examplePage)
        {
            /* The error occurs in this method */
            if (pubWeb == null)
                throw new ArgumentException("The pubWeb argument cannot be null.");
            PublishingSite pubSiteCollection = new PublishingSite(pubWeb.Web.Site);
            string pageLayoutName = "EnterpriseWiki.aspx"; // for testing purposes
            PageLayout layout = null;

            /* Option 1: Get page layout from collection with name of layout used as index
             * Result: System.NullReferenceException from GetPageLayouts()
             */

            layout = pubSiteCollection.PageLayouts["/_catalogs/masterpage/"+pageLayoutName];

            /* Option 2: Bring up an existing publishing page, then find the layout of that page using the Layout property
             * Result: Incorrect function COM exception
             */

            SPListItem listItem = pubWeb.Web.GetListItem(examplePage);
            PublishingPage item = PublishingPage.GetPublishingPage(listItem);
            layout = item.Layout;

            /* Option 3: Call "GetPageLayouts" and iterate through the results looking for a layout of a particular name
             * Result: System.NullReferenceException thrown from Microsoft.SharePoint.Publishing.PublishingSite.GetPageLayouts()
             */

            PageLayoutCollection layouts = pubSiteCollection.GetPageLayouts(true);
            for(int i = 0; i < layouts.Count; i++)
            {
                // String Comparison based on the Page Layout Name
                if (layouts[i].Name.Equals(pageLayoutName, StringComparison.InvariantCultureIgnoreCase))
                    layout = layouts[i];
            }

            return layout;
        }
4

1 回答 1

1

这是我在一周左右后找到的解决方案:

确保当您通过调用传递给它的 PublishingWeb.GetPublishingWeb(SPWeb) 方法获取“PublishingWeb”对象时,是一个已完全检索的 SPWeb 对象。更具体地说,我会确保在任何网站上调用 SPSite.OpenWeb,如下所示:

 using (SPSite site = new SPSite(folder.ParentWeb.Url))
            {
                SPWeb web = site.OpenWeb();
                PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web);
                /* work with PublishingWeb here ... */
                web.Close();
             }

一旦我做了这个简单的改变,问题中提到的所有错误都被清除了,无论我在什么上下文中调用“GetPageLayouts”或“GetAvailablePageLayouts”。方法文档说明了这一点,并且确实是这样的:

使用此方法可以访问已检索到的 SPWeb 类实例的 PublishingWeb 行为。

于 2011-08-04T20:57:05.213 回答