Как удалить SiteMapNode из asp: MENU Control, который определен в web.sitemap - PullRequest
1 голос
/ 25 августа 2010

У меня определена навигация в web.sitemap, и я хочу программно отключить некоторые siteMapNode.Как это возможно?

Например, у меня есть следующий узел: и я хочу отключить узел, если у него есть role = "Admin"

roleManager настроен как <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" />, а авторизация Windows - нетесть группа "Админ".Это похоже на Виртуальный.

Я попробовал следующее:

    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);
        }
    }

Затем я получаю: System.NotSupportedException: Коллекция доступна только для чтения.

Затем попробовал как

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

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

Но после этого я не знаю, как подключить эту новую коллекцию к навигации (объект Menu1)

Также пытался обработать каждый обработчик броска узла, например

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;
    }

Но это бросает вызов тому, что объект RootNode должен быть создан перед использованием оператора "new".Хотя я использовал следующее руководство: http://msdn.microsoft.com/en-us/library/ms178425.aspx

Есть предложения?http://forums.asp.net/t/894192.aspx здесь я нашел интересное обсуждение, где я не пробовал вариант с e.Item.Parent.ChildItems.Remove(e.Item)

Вот также интересный пример Как я могу удалить узлы из SiteMapNodeCollection? , но мойисточник данных имеет тип SiteMapDataSource, а не Repeater.DataSource

1 Ответ

0 голосов
/ 27 августа 2010

Я понял это следующим образом:

Я создал нового провайдера как

    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;
        }
    }

и сделал регистрацию провайдера в 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>
...