2010-08-25 6 views
1

J'ai la navigation définie dans web.sitemap et je veux désactiver par programme certains siteMapNode. Comment est-ce possible?Comment supprimer SiteMapNode d'ASP: MENU Contrôle défini dans web.sitemap

Par exemple, je vous que le nœud suivant: Et je veux désactiver nœud si elle a des rôles = « Admin »

roleManager est configuré comme <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" /> et Windows autorisation n'a pas de groupe « Admin ». C'est comme un virtuel.

J'ai essayé suivante:

SiteMapNodeCollection tempCollection = new SiteMapNodeCollection(SiteMap.RootNode.ChildNodes); 

    if (SiteMap.RootNode.ReadOnly) 
     SiteMap.RootNode.ReadOnly = false; 

    foreach (SiteMapNode node in tempCollection) 
    { 
     if (node.Roles.Contains("Admin")) 
     { 
      SiteMap.RootNode.ChildNodes.Remove(node); 
     } 
    } 

Je reçois: System.NotSupportedException: Collection est en lecture seule.

ensuite essayé comme

SiteMapNodeCollection modifiableCollection = new SiteMapNodeCollection(SiteMap.RootNode.ChildNodes); 

    foreach (SiteMapNode node in SiteMap.RootNode.ChildNodes) 
    { 
     if (node.Roles.Contains("Admin")) 
     { 
      modifiableCollection.Remove(node); 
     } 
    } 

Mais après que je ne sais pas comment brancher cette nouvelle collection en navigation (objet Menu1)

a également essayé de traiter chaque noeud gestionnaire de lancer, comme

SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.SiteMapAccess); 

    private SiteMapNode SiteMapAccess(Object sender, SiteMapResolveEventArgs e) 
    { 
     SiteMapNode RootNode = SiteMap.RootNode.Clone(true); 
     SiteMapNode tempNode = RootNode; 

     if (tempNode.Roles.Contains("Admin")) 
     { 
      tempNode.RootNode.ChildNodes.Remove(tempNode); 
     } 
     return RootNode; 
    } 

Mais il lance cet objet RootNode doit être créé avant d'utiliser "nouvelle" instruction. Bien que j'ai utilisé le prochain guide: http://msdn.microsoft.com/en-us/library/ms178425.aspx

Des suggestions? http://forums.asp.net/t/894192.aspx ici j'ai trouvé intéressante discussion où je ne l'ai pas essayé l'option avec e.Item.Parent.ChildItems.Remove(e.Item)

Voici également exemple intéressant How can I remove nodes from a SiteMapNodeCollection?, mais mon datasource avoir le type SiteMapDataSource, pas Repeater.DataSource

Répondre

0

je l'ai réalisé suivant:

I créé comme nouveau fournisseur

public class MainSiteMap : StaticSiteMapProvider 
    { 
     SiteMapNode _root = null; 

     public override SiteMapNode BuildSiteMap() 
     { 
      if (_root != null) 
       return _root; 

      Dictionary<Guid, SiteMapNode> nodes = new Dictionary<Guid, SiteMapNode>(); 
      Guid id = Guid.NewGuid(); 
      string[] roles = new string[] { "*" }; 

      _root = new SiteMapNode(this, id.ToString(), "~/Default.aspx", "Home", "RTD Home page"); 


      foreach (SiteMapNode node in SiteMap.Providers["RootSiteMap"].RootNode.ChildNodes) 

      { 
       if (!node.Roles.Contains("Admin")) 
       { 

        AddNode(node, _root); 
       } 
      } 

      _root.Roles = roles; 
      nodes.Add(id, _root); 
      AddNode(_root, null); 

      return _root; 
     } 

     protected override SiteMapNode GetRootNodeCore() 
     { 
      BuildSiteMap(); 

      return _root; 
     } 
    } 

et a fait l'enregistrement du fournisseur dans web.config:

<siteMap defaultProvider="MainSiteMap" enabled="true"> 
    <providers> 
    <add name="MainSiteMap" type="MainSiteMap" /> 
    <add name ="RootSiteMap" type="System.Web.XmlSiteMapProvider" siteMapFile="web.sitemap"/> 
    </providers> 
</siteMap> 
Questions connexes