Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建Sharepoint/MOSS站点地图_Sharepoint_Moss_Sitemap - Fatal编程技术网

创建Sharepoint/MOSS站点地图

创建Sharepoint/MOSS站点地图,sharepoint,moss,sitemap,Sharepoint,Moss,Sitemap,我正试图为我的莫斯出版网站创建一个站点地图,我有两种方法,但似乎两者都有 我的第一种方法是使用PortalSiteApprovider,它已经创建并很好地缓存了 PublishingWeb rootWeb = PublishingWeb.GetPublishingWeb(SPContext.Current.Site.RootWeb); //Get the URL of the default page in the web string defaultPageUrl = rootWeb.Def

我正试图为我的莫斯出版网站创建一个站点地图,我有两种方法,但似乎两者都有

我的第一种方法是使用PortalSiteApprovider,它已经创建并很好地缓存了

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();
这是完美的,除了在一个平面列表中返回所有站点的问题


理想情况下,我希望能够添加缩进以显示子网站。

通常,使用对象模型进行递归是个坏主意。这样做非常缓慢,而且需要大量资源
PortalItemApprovider
是为您预先缓存的,可以在毫秒内破坏整个站点结构

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

另外,在处理对象模型时,请确保处理每个网站。如果您不这样做,这将导致严重的问题。这包括处理
.Webs
集合中的每一个站点,即使您没有触摸它

编辑:


要使PortalItemApprovider仅返回Web,请将其
IncludePages
属性设置为
false

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

谢谢大家的回复,这就是我想到的

        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);
            }
        }
    }
我发现这些文章有帮助


您可以使用此工具:


好的,很酷,我想使用PortalItemApprovider,但我不确定如何将输出仅限于Web。
        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);
            }
        }
    }