MOSS SpNavigationNode.Children sempre vuoto
-
08-07-2019 - |
Domanda
Sto cercando di restituire tutti i nodi figlio di una serie di nodi di navigazione in sharepoint, l'SDK implica che dovrei fare qualcosa del genere:
NodeColl = objSite.Navigation.TopNavigationBar
Dim Node as SPNavigationNode
For Each Node In NodeColl
if Node.IsVisible then
Response.Write("<siteMapNode url=""" & Node.Url & """ title=""" & Node.Title & """ description=""" & Node.Title & """ >" & Environment.NewLine)
Dim SubChildNodes as SPNavigationNodeCollection = Node.Children
Response.Write(SubChildNodes.Count) 'returns 0 always even though I know theres over 20 nodes in some of the sections
Dim ChildNode as SPNavigationNode
For Each ChildNode in SubChildNodes
if ChildNode.IsVisible then
Response.Write("<siteMapNode url=""" & ChildNode.Url & """ title=""" & ChildNode.Title & """ description=""" & ChildNode.Title & """ />" & Environment.NewLine)
End if
Next
Response.Write("</siteMapNode>" & Environment.NewLine)
End If
Next
tuttavia ogni volta che lo faccio, elenca i nodi di navigazione di livello superiore ma non riesco a visualizzare i bambini.
Soluzione
Stavo affrontando lo stesso problema: stavo cercando di accedere a SPWeb.Navigation.Quicklaunch
da un ricevitore di funzionalità di una funzionalità con ambito Web attivato da onet.xml, ma SPWeb.Navigation .QuickLaunch.Count
era sempre 0, anche se avevo sicuramente aggiunto istanze di elenco in altre funzionalità attivate in precedenza nello stesso onet.xml.
La soluzione per me era aprire un nuovo SPSite e un nuovo SPWeb nel mio ricevitore di funzioni, dopo di che sono stato in grado di accedere agli elementi di avvio rapido. Ad esempio, questo ha funzionato per me:
using (SPSite site = new SPSite("http://yourserver/"))
{
using (SPweb web = site.OpenWeb("theweb"))
{
web.Navigation.QuickLaunch.Count ; // greater than zero
// manipulate your quick launch here
}
}
Suppongo che ciò avvenga perché la creazione del nuovo oggetto SPWeb carica lo stato più recente del Web dal database e l'SPWeb passato al mio ricevitore di funzioni non rappresentava l'ultimo stato. Ma questo sono io ragazzi
Altri suggerimenti
Ho lo stesso problema, ho trovato la soluzione come
using (SPSite site = new SPSite("http://server"))
{
using (SPWeb web = site.OpenWeb())
{
SPNavigationNode quicklaunch = web.Navigation.GetNodeById(1025);
if (quicklaunch != null)
{
foreach (SPNavigationNode heading in quicklaunch.Children)
{
PrintNode(heading);
}
}
}
}
static void PrintNode(SPNavigationNode node)
{
foreach (SPNavigationNode item in node.Children)
PrintNode(item);
}
Assicurati di avere un SiteMapDataSource
associato all'avvio rapido della tua pagina principale.