Pregunta

Estoy tratando de crear un mapa del sitio para mi sitio de publicación MOSS, tengo dos enfoques, pero parece que estoy atascado con ambos.

Mi primer enfoque es usar PortalSiteMapProvider, que ya está creado y bien almacenado en caché ...

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

pero esto parece devolver todo en la colección de sitios (por ejemplo, listas, encuestas). Solo quiero mostrar las webs de Sharepoint.

Mi otro enfoque era usar este código ...

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

Lo cual es perfecto, aparte del problema de devolver todas las webs en una lista plana.

Idealmente, quiero poder agregar sangría para mostrar redes secundarias.

¿Fue útil?

Solución 3

gracias por las respuestas a todos, esto es lo que se me ocurrió

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

Encontré estos artículos ayudados

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

Otros consejos

Generalmente es una mala idea usar el modelo de objetos para la recursividad. Hacer esto es extremadamente lento y requiere muchos recursos. PortalSiteMapProvider está pre-almacenado en caché para usted y puede desgarrar una estructura completa del sitio en milisegundos.

Con respecto a su pregunta sobre SPSite.AllWebs , esa propiedad devuelve una lista plana de todas las webs. Para eso es. Si desea una lista de solo las webs secundarias inmediatas , use la propiedad SPSite.RootWeb.Webs . Recurra sobre cada SPWeb en la propiedad .Webs , y llame a su propiedad .Webs para obtener una vista de árbol.

Además, cuando se trate con el modelo de objetos, asegúrese de DESECHAR CADA SITIO Y SITIO WEB . Esto causará problemas épicos si no lo haces. Esto incluye deshacerse de cada web en la colección .Webs , incluso si no la ha tocado.

Editar:

Para que PortalSiteMapProvider devuelva solo webs, establezca su propiedad IncludePages en false .

¿Ha intentado verificar el tipo de cada nodo en el bucle foreach utilizando la propiedad PortalSiteMapNode.Type y mostrando solo los nodos de tipo NodeTypes.Area?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top