PortalSiteMapProvider
Каждый раз, когда я создаю экземпляр экземпляра PortalSiteMapProvider, для него всегда по умолчанию используется корневое семейство веб-сайтов.
Я хочу иметь возможность получить карту сайта из другой коллекции на странице приложения.
Из-за этого в качестве контекста по умолчанию используется корневая сеть, поскольку эта страница приложения находится в _layouts и не размещается ни в одном семействе сайтов.
Как получить экземпляр для семейства сайтов, отличного от корневого Интернета, со страницы приложения?
Благодарю.
1 ответ
Вы не можете прочитать иерархию другого семейства сайтов через PortalSiteMapProvider. Например, если вы находитесь в семействе сайтов A, PSMP будет проходить только по дереву A, а не B. Для перехода по B. вам нужно быть в B
Обходной путь, который я реализовал, заключался в написании простого веб-сервиса, который работает в семействе сайтов и принимает путь в качестве параметра. Он читает свой собственный PSMP и записывает дерево XML с этой точки в иерархии. Вызывать веб-службу, живущую в SC-B, из кода, выполняемого в SC-A, чрезвычайно быстро, тем более что PSMP может так быстро прорвать структуру B.
Редактировать:
Вот инструкции по созданию веб-сервиса в 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. Используйте с осторожностью!