Crear un mapa del sitio Sharepoint / MOSS
-
22-07-2019 - |
Pregunta
Estoy tratando de crear un mapa del sitio para mi sitio de publicación MOSS, tengo dos enfoques, pero parece que estoy atascado con ambos.
Mi primer enfoque es usar PortalSiteMapProvider, que ya está creado y bien almacenado en caché ...
PublishingWeb rootWeb = PublishingWeb.GetPublishingWeb(SPContext.Current.Site.RootWeb);
//Get the URL of the default page in the web
string defaultPageUrl = rootWeb.DefaultPage.ServerRelativeUrl;
PortalListItemSiteMapNode webNode = (PortalListItemSiteMapNode)PortalSiteMapProvider.CurrentNavSiteMapProviderNoEncode.FindSiteMapNode(defaultPageUrl);
HttpContext.Current.Response.Output.WriteLine("Top Level: " + webNode.Title.ToString() + "<br />");
//iterate through each one of the pages and subsites
foreach (SiteMapNode smnTopLevelItem in webNode.ParentNode.ChildNodes)
{
HttpContext.Current.Response.Output.WriteLine(smnTopLevelItem.Title.ToString() + "<br />");
//if the current sitemap has children, create a submenu for it
if (smnTopLevelItem.HasChildNodes)
{
foreach (SiteMapNode smnChildItem in smnTopLevelItem.ChildNodes)
{
HttpContext.Current.Response.Output.WriteLine(smnChildItem.Title.ToString() + "<br />");
}
}
}
HttpContext.Current.Response.End();
pero esto parece devolver todo en la colección de sitios (por ejemplo, listas, encuestas). Solo quiero mostrar las webs de Sharepoint.
Mi otro enfoque era usar este código ...
SPSite siteCollection = new SPSite("http://example.org");
SPWebCollection sites = siteCollection.AllWebs;
foreach (SPWeb site in sites)
{
Console.WriteLine(site.Title.ToString() + " " + site.ServerRelativeUrl.ToString());
}
Lo cual es perfecto, aparte del problema de devolver todas las webs en una lista plana.
Idealmente, quiero poder agregar sangría para mostrar redes secundarias.
Solución 3
gracias por las respuestas a todos, esto es lo que se me ocurrió
public ListSiteMap()
{
PortalSiteMapProvider portalProvider1 = PortalSiteMapProvider.WebSiteMapProvider;
portalProvider1.DynamicChildLimit = 0;
portalProvider1.EncodeOutput = true;
SPWeb web = SPContext.Current.Site.RootWeb;
PortalSiteMapNode webNode = (PortalSiteMapNode)portalProvider1.FindSiteMapNode(web.ServerRelativeUrl);
if (webNode == null || webNode.Type != NodeTypes.Area) return;
Console.WriteLine(webNode.Title.ToString() + " - " + webNode.Description.ToString());
// get the child nodes (sub sites)
ProcessSubWeb(webNode);
}
private void ProcessSubWeb(PortalSiteMapNode webNode)
{
foreach (PortalSiteMapNode childNode in webNode.ChildNodes)
{
Console.WriteLine(childNode.Title.ToString() + " - " + childNode.Description.ToString());
//if the current web has children, call method again
if (childNode.HasChildNodes)
{
ProcessSubWeb(childNode);
}
}
}
Encontré estos artículos ayudados
http://blogs.mosshosting.com/archive /tags/SharePoint%20Object%20Model/default.aspx
http://www.hezser.de/blog/archive /tags/SPQuery/default.aspx
Otros consejos
Generalmente es una mala idea usar el modelo de objetos para la recursividad. Hacer esto es extremadamente lento y requiere muchos recursos. PortalSiteMapProvider
está pre-almacenado en caché para usted y puede desgarrar una estructura completa del sitio en milisegundos.
Con respecto a su pregunta sobre SPSite.AllWebs
, esa propiedad devuelve una lista plana de todas las webs. Para eso es. Si desea una lista de solo las webs secundarias inmediatas , use la propiedad SPSite.RootWeb.Webs
. Recurra sobre cada SPWeb
en la propiedad .Webs
, y llame a su propiedad .Webs
para obtener una vista de árbol.
Además, cuando se trate con el modelo de objetos, asegúrese de DESECHAR CADA SITIO Y SITIO WEB . Esto causará problemas épicos si no lo haces. Esto incluye deshacerse de cada web en la colección .Webs
, incluso si no la ha tocado.
Editar:
Para que PortalSiteMapProvider devuelva solo webs, establezca su propiedad IncludePages
en false
.
¿Ha intentado verificar el tipo de cada nodo en el bucle foreach utilizando la propiedad PortalSiteMapNode.Type y mostrando solo los nodos de tipo NodeTypes.Area?
Puede usar esta herramienta:
http: // realworldsa. blogspot.com/2010/12/new-tool-for-sharepoint-2007-and-2010.html