Remove a sitemapnode

本文关键字:sitemapnode Remove | 更新日期: 2023-09-27 18:13:15

我正在尝试设置基于角色/用户的站点地图。(我不能使用安全修剪,因为角色成员提供程序,我有它在服务器端,这将是复杂的实现),所以我要做的是简单地在获得项目删除后做它。

我有一个网站地图定义为:

<siteMapNode title="Gestion des roles" url="" description="Gestion des roles">
  <siteMapNode url="~/Membership/AddRole.aspx" title="Ajouter Role" description="Ajouter role" />
  <siteMapNode url="~/Membership/DeleteRole.aspx" title="Supprimer Role" description="Supprimer un role" />
</siteMapNode>
<siteMapNode title="Gestion des sites" url="" description="Gestion des sites">
  <siteMapNode url="~/Membership/AddSite.aspx" title="Ajouter Site" description="Ajouter un nouveau site" />
</siteMapNode>

我现在访问

的方式是这样的代码:

Menu menu = (Menu)Master.FindControl("Menu1");
String valuePath = @"Gestions/Gestion/Ajouter";
MenuItem item = menu.FindItem(valuePath);
if (item.Parent != null)
item.Parent.ChildItems.Remove(item);

但在执行后为空并抛出异常。感谢您的阅读

Remove a sitemapnode

您可以使用下面的递归函数找到基于Url的菜单项-

private MenuItem FindItem(MenuItemCollection collection, string url)
{
    foreach (MenuItem item in collection)
    {
        if (item.NavigateUrl.Equals(url, 
            StringComparison.InvariantCultureIgnoreCase))
            return item;
        if (item.ChildItems.Count > 0)
            return FindItem(item.ChildItems, url);
    }
    return null;
}
protected void Page_Load(object sender, EventArgs e)
{
    var menu = (Menu)Master.FindControl("NavigationMenu");
    // string valuePath = @"Gestions/Gestion/Ajouter";
    string valuePath = @"~/About/About2.aspx";
    var item = FindItem(menu.Items, valuePath);
    if(item != null)
    {
        if (item.Parent != null)
            item.Parent.ChildItems.Remove(item);
        else
            menu.Items.Remove(item);
    }
}

如果由于数据绑定问题而遇到在MENU中查找项的问题,可以使用ASP。. NET preendercomplete :

   protected void Page_PreRenderComplete(object sender, EventArgs e){}