Исключение NullReferenceException, генерируемое в "GetAvailablePageLayouts"
Я недавно столкнулся с этой ошибкой при попытке получить все макеты страниц на сайте публикации (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 ответ
Вот решение, которое я нашел примерно через неделю:
Убедитесь, что когда вы получаете объект "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, который уже был получен.