【问题标题】:PortalSiteMapProviderPortalSiteMapProvider
【发布时间】:2009-02-06 01:13:48
【问题描述】:

每次我实例化一个 PortalSiteMapProvider 实例时,它总是默认为根网站集合。

我希望能够从应用程序页面的不同集合中获取站点地图。

因此,上下文默认为根网站,因为此应用程序页面位于 _layouts 下,并且不托管在任何网站集下。

如何从应用程序页面获取除根 Web 之外的网站集的实例?

谢谢。

【问题讨论】:

    标签: sharepoint portalsitemapprovider


    【解决方案1】:

    您无法通过 PortalSiteMapProvider 读取另一个网站集的层次结构。例如,如果您在 Site Collection A 中,PSMP 只会遍历 A 的树,而不是 B。您必须在 B 中才能遍历 B。

    我实施的一种解决方法是编写一个简单的 Web 服务,该服务在网站集中运行并将路径作为参数。它读取自己的 PSMP 并从层次结构中的该点写入 XML 树。从 SC-A 中运行的代码调用存在于 SC-B 中的 Web 服务非常快,尤其是因为 PSMP 可以如此快速地破坏 B 的结构。

    编辑:

    Here are instructions for creating a web service in WSS3/MOSS.

    这里有一些完全没有功能的代码可以让你朝着正确的方向前进:

    //method exposed through the web service
    public XmlDocument GetTree(string path)
    {
        PortalSiteMapProvider psmp = PortalSiteMapProvider.GlobalNavSiteMapProvider;
        SiteMapNode node = psmp.FindSiteMapNode(path);
        return BuildXmlFromNode(node);
    }
    
    private XmlNode BuildXmlFromNode(SiteMapNode node)
    {
        XmlDocument xml = new XmlDocument();
        reutrn BuildXmlFromNode(node, xml);
    }
    
    //recurses down the sitemapnode children
    private XmlNode BuildXmlFromNode(SiteMapNode node, XmlNode xml)
    {
        XmlElement element = doc.CreateElement("Node")
        element.SetAttribute("title", node.Title);
        element.SetAttribute("url", node.Url);
    
        xml.AppendChild(element);
    
        foreach(SiteMapNode childNode in node.ChildNodes)
        {
            BuildXmlFromNode(childNode, element);
        }
    
        return xml;
    }
    

    请注意如果您没有对递归次数设置限制并且您的站点地图层次结构非常深和/或宽,这可能会生成一个巨大的 xml 文档。谨慎使用!

    【讨论】:

    • 你介意帮我写一个简单的网络服务吗?我以前从来没有做过。有什么指示可以引导我朝那个方向发展吗?谢谢!
    • @LB 没问题;请参阅上面答案的补充内容。
    • 非常感谢!非常感激!这应该让我开始。
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多