2009-06-24 9 views
2

Ich versuche eine Sitemap für meine MOSS-Publishing-Site zu erstellen, ich habe zwei Ansätze, aber scheinen mit beiden festgefahren zu sein.Erstellen von Sharepoint/MOSS Sitemap

Mein erster Ansatz ist, die PortalSiteMapProvider zu verwenden, die bereits erstellt und schön im Cache gespeichert ...

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(); 

aber dies scheint alles in der Websitesammlung zurück (zum Beispiel Listen, surverys). Ich möchte nur die Sharepoint-Webs zeigen.

Mein anderer Ansatz war dieses Stück Code zu verwenden ..

SPSite siteCollection = new SPSite("http://example.org"); 
SPWebCollection sites = siteCollection.AllWebs; 
foreach (SPWeb site in sites) 
{ 
    Console.WriteLine(site.Title.ToString() + " " + site.ServerRelativeUrl.ToString()); 
} 

Welche perfekt ist, abgesehen von dem Problem in einer einfachen Liste alle Bahnen zurückzukehren.

Idealerweise möchte ich einen Einzug einfügen können, um untergeordnete Webs anzuzeigen.

Antwort

1

Dank für den jeden replys, das ist, was ich mit

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

fand ich half dieser Artikel

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

Im Allgemeinen ist es eine schlechte Idee, das Objektmodell für die Rekursion zu verwenden. Es ist extrem langsam und ressourcenintensiv, dies zu tun. PortalSiteMapProvider wird für Sie vorab zwischengespeichert und kann die gesamte Site-Struktur in Millisekunden durchbrechen.

In Bezug auf Ihre Frage zu SPSite.AllWebs, geht das Eigentum eine einfache Liste aller Bahnen zurück. Dafür ist es da. Wenn Sie eine Liste von nur Unmittelbar Unterweben möchten, verwenden Sie die SPSite.RootWeb.Webs Eigenschaft. Riskiere über jede SPWeb in der .Webs Eigenschaft, und rufe ihre .Webs Eigenschaft der Reihe nach an, um eine Baumansicht zu erhalten.

Achten Sie auch beim Umgang mit dem Objektmodell auf ENTSPRECHEN SIE JEDES WEB UND SITE. Dies führt zu epischen, schlechten Problemen, wenn Sie dies nicht tun. Dies beinhaltet die Entsorgung jedes Webs in der .Webs Kollektion, auch wenn Sie es nicht berührt haben.

Edit:

Um die PortalSiteMapProvider zu bekommen nur Bahnen zurückzukehren, stellen seine IncludePages Eigenschaft auf false.

+0

ok cool, ich möchte PortalSiteMapProvider verwenden, aber ich bin nicht sicher, wie die Ausgabe beschränken sich nur auf Bahnen. – Rob

2

Haben Sie versucht, den Typ jedes Knotens in der foreach-Schleife mithilfe der PortalSiteMapNode.Type-Eigenschaft zu überprüfen und nur Knoten vom Typ NodeTypes.Area anzuzeigen?

+0

Ausgezeichnete Antwort! – Colin