Создание карты сайта Sharepoint/MOSS
Я пытаюсь создать карту сайта для своего сайта публикации MOSS, у меня есть два подхода, но, похоже, они застряли на обоих.
Мой первый подход заключается в использовании PortalSiteMapProvider, который уже создан и хорошо кэширован...
PublishingWeb rootWeb = PublishingWeb.GetPublishingWeb(SPContext.Current.Site.RootWeb);
//Get the URL of the default page in the web
string defaultPageUrl = rootWeb.DefaultPage.ServerRelativeUrl;
PortalListItemSiteMapNode webNode = (PortalListItemSiteMapNode)PortalSiteMapProvider.CurrentNavSiteMapProviderNoEncode.FindSiteMapNode(defaultPageUrl);
HttpContext.Current.Response.Output.WriteLine("Top Level: " + webNode.Title.ToString() + "<br />");
//iterate through each one of the pages and subsites
foreach (SiteMapNode smnTopLevelItem in webNode.ParentNode.ChildNodes)
{
HttpContext.Current.Response.Output.WriteLine(smnTopLevelItem.Title.ToString() + "<br />");
//if the current sitemap has children, create a submenu for it
if (smnTopLevelItem.HasChildNodes)
{
foreach (SiteMapNode smnChildItem in smnTopLevelItem.ChildNodes)
{
HttpContext.Current.Response.Output.WriteLine(smnChildItem.Title.ToString() + "<br />");
}
}
}
HttpContext.Current.Response.End();
но это, кажется, возвращает все в семействе сайтов (например, списки, опросы). Я только хочу показать сети Sharepoint.
Мой другой подход состоял в том, чтобы использовать этот кусок кода..
SPSite siteCollection = new SPSite("http://example.org");
SPWebCollection sites = siteCollection.AllWebs;
foreach (SPWeb site in sites)
{
Console.WriteLine(site.Title.ToString() + " " + site.ServerRelativeUrl.ToString());
}
Что идеально, если не считать проблему возврата всех сетей в единый список.
В идеале я хочу иметь возможность добавлять отступы, чтобы показывать дочерние сети.
4 ответа
Спасибо всем за ответы, вот что я придумала
public ListSiteMap()
{
PortalSiteMapProvider portalProvider1 = PortalSiteMapProvider.WebSiteMapProvider;
portalProvider1.DynamicChildLimit = 0;
portalProvider1.EncodeOutput = true;
SPWeb web = SPContext.Current.Site.RootWeb;
PortalSiteMapNode webNode = (PortalSiteMapNode)portalProvider1.FindSiteMapNode(web.ServerRelativeUrl);
if (webNode == null || webNode.Type != NodeTypes.Area) return;
Console.WriteLine(webNode.Title.ToString() + " - " + webNode.Description.ToString());
// get the child nodes (sub sites)
ProcessSubWeb(webNode);
}
private void ProcessSubWeb(PortalSiteMapNode webNode)
{
foreach (PortalSiteMapNode childNode in webNode.ChildNodes)
{
Console.WriteLine(childNode.Title.ToString() + " - " + childNode.Description.ToString());
//if the current web has children, call method again
if (childNode.HasChildNodes)
{
ProcessSubWeb(childNode);
}
}
}
Я нашел эти статьи помогли
http://blogs.mosshosting.com/archive/tags/SharePoint%20Object%20Model/default.aspx
Обычно плохая идея использовать объектную модель для рекурсии. Это очень медленно и ресурсоемко, чтобы сделать это. PortalSiteMapProvider
предварительно кэшируется для вас и может порвать всю структуру сайта за миллисекунды.
Относительно вашего вопроса о SPSite.AllWebs
, это свойство возвращает плоский список всех сетей. Вот для чего это. Если вы хотите получить список только непосредственных дочерних сетей, используйте SPSite.RootWeb.Webs
имущество. Рекурсировать за каждого SPWeb
в .Webs
собственности, и назовите их .Webs
свойство в свою очередь, чтобы получить древовидное представление.
Также при работе с объектной моделью НЕОБХОДИМО ОТКРЫТЬ КАЖДЫЙ ВЕБ-САЙТ. Это вызовет эпические проблемы, если вы этого не сделаете. Это включает в себя удаление каждой сети в .Webs
коллекцию, даже если вы ее не трогали.
Редактировать:
Чтобы PortalSiteMapProvider возвращал только веб-сайты, установите его IncludePages
собственность на false
,
Вы пытались проверить тип каждого узла в цикле foreach, используя свойство PortalSiteMapNode.Type и отображая только узлы типа NodeTypes.Area?
Вы можете использовать этот инструмент:
http://realworldsa.blogspot.com/2010/12/new-tool-for-sharepoint-2007-and-2010.html