创建Sharepoint/MOSS站点地图

Rob*_*Rob 2 sitemap sharepoint moss

我正在尝试为我的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();
Run Code Online (Sandbox Code Playgroud)

但这似乎返回了网站集中的所有内容(例如列表,surverys).我只想展示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());
}
Run Code Online (Sandbox Code Playgroud)

这是完美的,除了将所有网络返回到平面列表中的问题.

理想情况下,我希望能够添加缩进来显示子网.

Rex*_*x M 6

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

关于你的问题SPSite.AllWebs,该属性确实返回所有网站的平面列表.这就是它的用途.如果您只想要直接子网站的列表,请使用该SPSite.RootWeb.Webs属性.递归在每个SPWeb.Webs属性,并调用它们.Webs反过来属性来获取树视图.

此外,在处理对象模型时,请确保对每个网站和站点进行处理.如果不这样做,这将导致史诗般的坏问题.这包括处理.Webs集合中的每个Web ,即使您没有触及它.

编辑:

要使PortalSiteMapProvider仅返回web,请将其IncludePages属性设置为false.