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. Используйте с осторожностью!

Другие вопросы по тегам