2009-07-22 6 views
1

J'ai un site simple constitué d'un site racine avec 2 sites enfants.Custom SharePoint Navigation 2 niveaux Deep

Maintenant, je veux la navigation pour les 3 sites à exactement la même et lire:

Racine du site | Site enfant 1 | Site enfant 2

Le site actuellement sélectionné étant en surbrillance.

J'ai été en mesure de le faire manuellement presque en utilisant un contrôle asp: répétiteur et portalsitemapprovider. Le problème est que je peux soit obtenir juste le site racine sur la navigation (définir ShowStartingNode à True) ou seulement les sites enfants, je ne peux pas obtenir les deux.

Je sais que vous pouvez obtenir les deux si vous utilisez un sharepoint: le contrôle aspmenu et réglez staticdisplaylevels à 2 mais je n'aime pas le code désordonné que ce contrôle crache. Fondamentalement, je veux émuler ce comportement de contrôle enveloppé dans mon propre css conforme. Des idées?

  • également comme un ajout que quelqu'un a des idées sur la façon dont je peux l'avoir si subsite1/2 ont sous-sites/pages suivantes, il n'a pas d'importance combien de niveaux de profondeur dans la hiérarchie un utilisateur navigue, il met toujours en évidence le sous-site1 ou sous-site2 pertinent? Ma méthode actuelle compare currentnode avec chacun des nœuds fournisseurs à mettre en évidence, mais cela ne fonctionne pas une fois que l'utilisateur a quitté la page de destination de chaque sous-site.

Merci!

Répondre

1

Je pense que vous devez commencer à la racine et de rendre ce noeud dans un premier répéteur, puis utiliser les childNodes de la racine en tant que source de données pour un second répéteur, quelque chose comme:

<asp:Repeater runat="server" ID="MenuRepeater" 
DataSourceID="MainNavigationDataSource"> 

<HeaderTemplate> 
    // code here 
</HeaderTemplate> 

<ItemTemplate> 
    // code here 
<asp:Repeater runat="server" ID="ChildMenuRepeater" 
DataSource='<%# ((SiteMapNode)Container.DataItem).ChildNodes %>'> 

<HeaderTemplate> 
    // code here 
</HeaderTemplate> 

<ItemTemplate> 
    // code here 

</ItemTemplate> 

</ItemTemplate> 

Pour votre deuxième question, je pense (si je comprends bien) que vous pourriez utiliser la méthode SiteMapNode.IsDescendantOf() mais je rappelle en quelque sorte que cela ne fonctionnera pas dans SharePoint donc j'ai utilisé ce genre de code pour vérifier si un nœud est le "actif" nœud:

string CurrentContextUrl = SPUtility.GetPageUrlPath(HttpContext.Current); 
Uri CurrentUri = new Uri(CurrentContextUrl); 
bool Active = CurrentUri.LocalPath.Equals(currentNode.Url); 

ps en quelque sorte :-)

+0

A travaillé parfaitement merci beaucoup! Btw le IsDescendantOf fonctionne bien dans SharePoint ainsi :) – Eriedor