Создание карты сайта Sharepoint / MOSS - PullRequest
2 голосов
/ 24 июня 2009

Я пытаюсь создать карту сайта для своего сайта публикации 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();

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

Что идеально, если не считать проблему возврата всех сетей в единый список.

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

Ответы [ 4 ]

6 голосов
/ 24 июня 2009

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

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

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

Edit:

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

2 голосов
/ 24 июня 2009

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

1 голос
/ 09 декабря 2010

Вы можете использовать этот инструмент:

http://realworldsa.blogspot.com/2010/12/new-tool-for-sharepoint-2007-and-2010.html

1 голос
/ 26 июня 2009

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

        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

...