2009-06-24 6 views
2

Я пытаюсь создать карту сайта для моего сайта публикации MOSS, у меня есть два подхода, но похоже, что они застряли в обоих.Создание карты сайта Sharepoint/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(); 

, но это, кажется, вернуть все в семействе веб-сайтов (например, списки, surverys). Я хочу показать веб-сайты 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()); 
} 

Который совершенен, кроме проблемы возвращения всех полотен в виде плоского списка.

В идеале, я хочу иметь возможность добавлять отступы для отображения дочерних веб-сайтов.

ответ

1

спасибо за отвечено всем, это то, что я придумал

 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.msdn.com/ecm/archive/2007/05/23/increased-performance-for-moss-apps-using-the-portalsitemapprovider.aspx

http://blogs.mosshosting.com/archive/tags/SharePoint%20Object%20Model/default.aspx

http://www.hezser.de/blog/archive/tags/SPQuery/default.aspx

6

Как правило, это плохая идея использовать объектную модель для рекурсии. Для этого очень медленно и ресурсоемким. PortalSiteMapProvider предварительно кэшируется для вас и может разрывать всю структуру сайта в миллисекундах.

Что касается вашего вопроса о SPSite.AllWebs, это свойство действительно возвращает плоский список всех веб-сайтов. Вот для чего это. Если вам нужен только список дочерних веб-сайтов, используйте свойство SPSite.RootWeb.Webs. Пересчитайте каждый SPWeb в собственности .Webs и позвоните в свой .Webs объект, чтобы получить древовидный вид.

Также, имея дело с объектной моделью, удостоверьтесь, что УТИЛИТЬ КАЖДЫЙ ВЕБ И САЙТ. Это приведет к эпическим плохим проблемам, если вы этого не сделаете. Это включает в себя размещение каждого веб-сайта в коллекции .Webs, даже если вы его не коснулись.

Edit:

Чтобы получить PortalSiteMapProvider возвращать только полотна, установите его свойство IncludePages в false.

+0

нормально круто, я хотел бы использовать PortalSiteMapProvider, но я не уверен, как ограничить вывод перемычки только. – Rob

2

Пробовал ли вы проверять тип каждого узла в цикле foreach с использованием свойства PortalSiteMapNode.Type и отображать только узлы типа NodeTypes.Area?

+0

Отличный ответ! – Colin

Смежные вопросы