Исключение NullReferenceException, генерируемое в «GetAvailablePageLayouts» - PullRequest
0 голосов
/ 05 августа 2011

Недавно я столкнулся с этой ошибкой при попытке получить все макеты страниц на сайте публикации (Microsoft.SharePoint.Publishing.PublishingWeb) со страницы пользовательских макетов на дочернем сайте. Код работал на сервере VM с использованием сайта, созданного из шаблона сайта Enterprise Wiki. Но при запуске на сервере разработки в коде возникали различные исключения.

Пытаясь обойти ошибку, я закодировал класс тремя различными способами. Все три работали в виртуальной машине, но все три вызывали исключение при использовании в сервере разработки Пример:

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;
        }

1 Ответ

1 голос
/ 05 августа 2011

Вот решение, которое я нашел примерно через неделю:

Убедитесь, что при получении объекта «PublishingWeb» вызовите этот метод PublishingWeb.GetPublishingWeb (SPWeb), который вы передаете в него объект 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». Документация метода говорит об этом, и это действительно означает:

Используйте этот метод для доступа к поведению PublishingWeb для экземпляр класса SPWeb, который уже был получен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...