PortalSiteMapProvider - PullRequest
       22

PortalSiteMapProvider

2 голосов
/ 06 февраля 2009

Каждый раз, когда я создаю экземпляр экземпляра PortalSiteMapProvider, для него по умолчанию всегда используется корневое семейство веб-сайтов.

Я хочу иметь возможность получить карту сайта из другой коллекции на странице приложения.

Из-за этого в качестве контекста по умолчанию используется корневая сеть, поскольку эта страница приложения находится в _layouts и не размещается ни в одном семействе сайтов.

Как получить экземпляр для семейства сайтов, отличного от корневого веб-сайта, со страницы приложения?

Спасибо.

1 Ответ

5 голосов
/ 06 февраля 2009

Вы не можете прочитать иерархию другого семейства сайтов через PortalSiteMapProvider. Например, если вы находитесь в семействе сайтов A, PSMP будет проходить только по дереву A, а не B. Для перехода по B. вам нужно быть в B *

Обходной путь, который я реализовал, заключался в написании простого веб-сервиса, который работает в семействе сайтов и принимает путь в качестве параметра. Он читает свой собственный PSMP и записывает дерево XML с этой точки в иерархии. Вызывать веб-службу, живущую в SC-B, из кода, выполняемого в SC-A, очень быстро, тем более что PSMP может так быстро прорвать структуру B.

Edit:

Здесь приведены инструкции по созданию веб-службы в 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. Используйте с осторожностью!

...