如何从 web.sitemap 中定义的 asp:MENU 控件中删除 SiteMapNode

发布于 2024-09-15 21:34:42 字数 2195 浏览 4 评论 0 原文

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

例如我有下一个节点: 我想禁用节点,如果它有 Roles="Admin"

roleManager 设置为 并且 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:集合是只读的。

然后尝试像

    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) 选项,

这也是有趣的示例 如何从 SiteMapNodeCollection 中删除节点?,但我的数据源具有 SiteMapDataSource 类型,而不是 Repeater.DataSource

I have navigation defined in web.sitemap and I want programmaticly disable some siteMapNode. How is it possible?

For example I have next node:

And I want disable node if it has roles="Admin"

roleManager is set up like <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" /> and Windows Authorization does not have "Admin" group. It is like Virtual one.

I tried next:

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

Then I am getting: System.NotSupportedException: Collection is read-only.

Then tried like

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

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

But after that I dont know how to plug that new collection into navigation (Menu1 object)

Also tried to process every node throw handler, like

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

But it is throwing that RootNode object should be created before using "new" statement. Although I used next guide: http://msdn.microsoft.com/en-us/library/ms178425.aspx

Any suggestions? http://forums.asp.net/t/894192.aspx here I found interesting discussion where I did not try option with e.Item.Parent.ChildItems.Remove(e.Item)

Here is also interesting example How can I remove nodes from a SiteMapNodeCollection?, but my datasource have SiteMapDataSource type, not Repeater.DataSource

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独孤求败 2024-09-22 21:34:42

接下来我意识到:

我创建了新的提供程序

    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>

I realized it next:

I created new provider like

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

and did Provider registration in 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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文