【问题标题】:How to remove SiteMapNode from asp:MENU Control that defined in web.sitemap如何从 web.sitemap 中定义的 asp:MENU 控件中删除 SiteMapNode
【发布时间】:2010-08-25 09:06:38
【问题描述】:

我在 web.sitemap 中定义了导航,我想以编程方式禁用某些 siteMapNode。怎么可能?

例如我有下一个节点: 我想禁用节点,如果它有角色=“管理员”

roleManager 的设置类似于<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" />,并且 Windows 授权没有“Admin”组。就像虚拟的一样。

接下来我尝试了:

    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: Collection is read-only.

然后试了一下

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

但是在使用“new”语句之前应该创建 RootNode 对象。虽然我使用了下一个指南:http://msdn.microsoft.com/en-us/library/ms178425.aspx

有什么建议吗? http://forums.asp.net/t/894192.aspx 在这里我发现了有趣的讨论,我没有尝试使用 e.Item.Parent.ChildItems.Remove(e.Item) 的选项

这也是一个有趣的例子How can I remove nodes from a SiteMapNodeCollection?,但我的数据源有 SiteMapDataSource 类型,而不是 Repeater.DataSource

【问题讨论】:

    标签: asp.net aspmenu


    【解决方案1】:

    接下来我意识到了:

    我创建了新的提供者,例如

        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 中注册了 Provider:

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

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多