Pergunta

Eu estou tentando criar um mapa do site para o meu MOSS site de publicação, eu tenho duas abordagens, mas parecem ser preso com ambos.

A minha primeira abordagem é usar o PortalSiteMapProvider, que já está criado e bem em 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();

mas isso parece retornar tudo no conjunto de sites (por exemplo, listas, surverys). Eu só quero mostrar as teias do SharePoint.

A minha outra abordagem era usar este pedaço de 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());
}

O que é perfeito, além do problema de retornar todas as teias em uma lista simples.

Idealmente, eu quero ser capaz de adicionar recuo para mostrar teias criança.

Foi útil?

Solução 3

obrigado pela replys todos, isto é o que eu vim com

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

Eu encontrei estes artigos ajudaram

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

Outras dicas

Geralmente é uma má idéia para usar o modelo de objeto para a recursividade. É extremamente lento e para isso uso intensivo de recursos. PortalSiteMapProvider é pré-armazenados em cache para você e pode rasgar toda uma estrutura do site em milissegundos.

Quanto à sua pergunta sobre SPSite.AllWebs, que a propriedade faz retornar uma lista simples de todas as teias. Isso é o que é para. Se você quer uma lista de apenas os teias filho imediato, use a propriedade SPSite.RootWeb.Webs. Recurse sobre cada SPWeb na propriedade .Webs, e chamar sua propriedade .Webs por sua vez para obter uma árvore-view.

Além disso, quando se lida com o modelo de objeto, certifique-se de WEB DESCARTE CADA E SITE . Isso causará problemas épicos ruim se você não. Isso inclui a eliminação cada Web na coleção .Webs, mesmo se você não tê-la tocado.

Editar:

Para obter o PortalSiteMapProvider para retornar apenas teias, defina sua propriedade IncludePages para false.

Você tentou verificar o tipo de cada nó no loop foreach usando a propriedade PortalSiteMapNode.Type e exibir apenas os nós do tipo NodeTypes.Area?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top