Domanda

Sto cercando di creare una sitemap per il mio sito di pubblicazione MOSS, ho due approcci ma mi sembra di essere bloccato con entrambi.

Il mio primo approccio è usare PortalSiteMapProvider, che è già stato creato e ben memorizzato nella cache ...

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

ma questo sembra restituire tutto nella raccolta siti (ad esempio elenchi, sondaggi). Voglio solo mostrare i web di Sharepoint.

Il mio altro approccio era usare questo pezzo di codice ..

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

Il che è perfetto, a parte il problema di restituire tutte le reti in una lista piatta.

Idealmente, vorrei essere in grado di aggiungere un rientro per mostrare le reti secondarie.

È stato utile?

Soluzione 3

grazie per le risposte a tutti, questo è quello che mi è venuto in mente

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

Ho trovato utili questi articoli

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

Altri suggerimenti

Generalmente è una cattiva idea usare il modello a oggetti per la ricorsione. È estremamente lento e dispendioso in termini di risorse per fare questo. PortalSiteMapProvider è pre-memorizzato nella cache per te e può lacerare un'intera struttura del sito in millisecondi.

Per quanto riguarda la tua domanda su SPSite.AllWebs , quella proprietà restituisce un elenco semplice di tutti i web. Ecco a cosa serve. Se si desidera un elenco solo delle reti figlio immediate , utilizzare la proprietà SPSite.RootWeb.Webs . Esamina ogni SPWeb nella proprietà .Web e chiama a sua volta la proprietà .Webs per ottenere una visualizzazione ad albero.

Inoltre, quando si ha a che fare con il modello a oggetti, assicurarsi di SMALTARE OGNI WEB E SITO . Questo causerà problemi epici se non lo fai. Ciò include lo smaltimento di ogni Web nella raccolta .Web , anche se non l'hai toccato.

Modifica:

Per fare in modo che PortalSiteMapProvider restituisca solo web, impostare la proprietà IncludePages su false .

Hai provato a controllare il tipo di ogni nodo nel ciclo foreach usando la proprietà PortalSiteMapNode.Type e visualizzando solo nodi di tipo NodeTypes.Area?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top