Creazione di Sitemap Sharepoint / MOSS
-
22-07-2019 - |
Domanda
Sto cercando di creare una sitemap per il mio sito di pubblicazione MOSS, ho due approcci ma mi sembra di essere bloccato con entrambi.
Il mio primo approccio è usare PortalSiteMapProvider, che è già stato creato e ben memorizzato nella cache ...
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();
ma questo sembra restituire tutto nella raccolta siti (ad esempio elenchi, sondaggi). Voglio solo mostrare i web di Sharepoint.
Il mio altro approccio era usare questo pezzo di codice ..
SPSite siteCollection = new SPSite("http://example.org");
SPWebCollection sites = siteCollection.AllWebs;
foreach (SPWeb site in sites)
{
Console.WriteLine(site.Title.ToString() + " " + site.ServerRelativeUrl.ToString());
}
Il che è perfetto, a parte il problema di restituire tutte le reti in una lista piatta.
Idealmente, vorrei essere in grado di aggiungere un rientro per mostrare le reti secondarie.
Soluzione 3
grazie per le risposte a tutti, questo è quello che mi è venuto in mente
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);
}
}
}
Ho trovato utili questi articoli
http://blogs.mosshosting.com/archive /tags/SharePoint%20Object%20Model/default.aspx
http://www.hezser.de/blog/archive /tags/SPQuery/default.aspx
Altri suggerimenti
Generalmente è una cattiva idea usare il modello a oggetti per la ricorsione. È estremamente lento e dispendioso in termini di risorse per fare questo. PortalSiteMapProvider
è pre-memorizzato nella cache per te e può lacerare un'intera struttura del sito in millisecondi.
Per quanto riguarda la tua domanda su SPSite.AllWebs
, quella proprietà restituisce un elenco semplice di tutti i web. Ecco a cosa serve. Se si desidera un elenco solo delle reti figlio immediate , utilizzare la proprietà SPSite.RootWeb.Webs
. Esamina ogni SPWeb
nella proprietà .Web
e chiama a sua volta la proprietà .Webs
per ottenere una visualizzazione ad albero.
Inoltre, quando si ha a che fare con il modello a oggetti, assicurarsi di SMALTARE OGNI WEB E SITO . Questo causerà problemi epici se non lo fai. Ciò include lo smaltimento di ogni Web nella raccolta .Web
, anche se non l'hai toccato.
Modifica:
Per fare in modo che PortalSiteMapProvider restituisca solo web, impostare la proprietà IncludePages
su false
.
Hai provato a controllare il tipo di ogni nodo nel ciclo foreach usando la proprietà PortalSiteMapNode.Type e visualizzando solo nodi di tipo NodeTypes.Area?
Puoi usare questo strumento:
http: // realworldsa. blogspot.com/2010/12/new-tool-for-sharepoint-2007-and-2010.html