sharepoint - PortalSiteMapProvider
(1)
Cada vez que instancia una instancia de PortalSiteMapProvider, siempre se establece de forma predeterminada en la Colección de sitios web raíz.
Deseo poder adquirir un mapa del sitio de una colección diferente de una página de la aplicación.
Debido a esto, el contexto se establece de forma predeterminada en la web raíz, ya que esta página de aplicación reside en _layouts y no está alojada en ninguna colección de sitios.
¿Cómo puedo adquirir una instancia para una colección de sitios que no sea la web raíz desde una página de la aplicación?
Gracias.
No puede leer la jerarquía de otra colección de sitios a través de PortalSiteMapProvider. Por ejemplo, si estás en la Colección de sitios A, PSMP solo atravesará el árbol de A, no B. Tienes que estar en B para atravesar B.
Una solución que implementé fue escribir un servicio web simple que se ejecuta en una colección de sitios y toma una ruta como parámetro. Lee su propio PSMP y escribe un árbol XML desde ese punto en la jerarquía. Llamar al servicio web que vive en SC-B desde el código que se ejecuta en SC-A es extremadamente rápido, especialmente porque el PSMP puede atravesar la estructura de B tan rápidamente.
Editar:
Aquí hay instrucciones para crear un servicio web en WSS3 / MOSS .
Aquí hay un código totalmente no funcional para dirigirte en la dirección correcta:
//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;
}
Tenga en cuenta que si no establece un límite en el número de recursiones y la jerarquía del mapa del sitio es muy profunda y / o amplia, esto podría producir un enorme documento xml. Usar con precaución!