每次我实例化一个 PortalSiteMapProvider 实例时,它总是默认为根网站集合。
我希望能够从应用程序页面的不同集合中获取站点地图。
因此,上下文默认为根 Web,因为此应用程序页面位于 _layouts 下,并且不托管在任何网站集下。
如何从应用程序页面获取除根 Web 之外的网站集的实例?
谢谢。
每次我实例化一个 PortalSiteMapProvider 实例时,它总是默认为根网站集合。
我希望能够从应用程序页面的不同集合中获取站点地图。
因此,上下文默认为根 Web,因为此应用程序页面位于 _layouts 下,并且不托管在任何网站集下。
如何从应用程序页面获取除根 Web 之外的网站集的实例?
谢谢。
您无法通过 PortalSiteMapProvider 读取另一个网站集的层次结构。例如,如果您在 Site Collection A 中,PSMP 只会遍历 A 的树,而不是 B。您必须在 B 中才能遍历 B。
我实施的一种解决方法是编写一个简单的 Web 服务,该服务在网站集中运行并将路径作为参数。它读取自己的 PSMP 并从层次结构中的该点写入 XML 树。从 SC-A 中运行的代码调用存在于 SC-B 中的 Web 服务非常快,尤其是因为 PSMP 可以如此快速地破坏 B 的结构。
编辑:
这是一些完全没有功能的代码,可以让您朝着正确的方向前进:
//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 文档。谨慎使用!