删除sitemapnode

时间:2013-05-13 15:06:52

标签: c# asp.net

我正在尝试设置基于角色/用户的站点地图..(我不能使用securitytrimming,因为角色成员资格提供者,我在服务器端有它,并且它实现起来很复杂)所以我是什么我想要做的就是在获取项目后立即执行此操作。

我的网站地图定义为:

                              

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

但是在执行该项之后为null并抛出异常。 谢谢你的阅读

2 个答案:

答案 0 :(得分:0)

您可以使用此递归函数找到基于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);
    }
}

答案 1 :(得分:0)

如果您因为数据绑定问题在菜单中查找项目时遇到问题,可以使用ASP.NET PreRenderComplete

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