2

我正在尝试为我的 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

4 回答 4

6

通常,使用对象模型进行递归是一个坏主意。这样做非常缓慢且资源密集。PortalSiteMapProvider为您预先缓存,并且可以在几毫秒内撕裂整个站点结构。

关于您的问题SPSite.AllWebs,该属性确实返回所有网络的平面列表。这就是它的用途。如果您只需要直接子网站的列表,请使用该SPSite.RootWeb.Webs属性。递归每个属性,并依次调用它们的SPWeb属性以获得树视图。.Webs.Webs

此外,在处理对象模型时,请确保DISPOSE EVERY WEB AND SITE。如果您不这样做,这将导致严重的问题。这包括处理.Webs集合中的每个网络,即使您没有碰过它。

编辑:

要让 PortalSiteMapProvider 仅返回网站,请将其IncludePages属性设置为false.

于 2009-06-24T16:32:43.830 回答
2

您是否尝试过使用 PortalSiteMapNode.Type 属性检查 foreach 循环中每个节点的类型并仅显示 NodeTypes.Area 类型的节点?

于 2009-06-24T19:33:33.050 回答
1

谢谢大家的回复,这是我想出来的

        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

于 2009-06-26T09:38:36.347 回答
1

你可以使用这个工具:

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

于 2010-12-09T14:23:53.867 回答