Shadow_boi
Shadow_boi

Reputation: 2198

ASP.net How to hide a menu item from visitor?

I want to hide the "Admin Panel" menu item from visitor, without going into the Role approach.

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="" title="Nav"  description="">
        <siteMapNode url="~/Default.aspx" title="Home"  description=""></siteMapNode>
        <siteMapNode url="~/About.aspx" title="About"  description=""></siteMapNode>
        <siteMapNode url="" title="Admin Panel"  description="">
          <siteMapNode url="~/Admin/AddPosts.aspx" title="Add Posts"  description=""></siteMapNode>
          <siteMapNode url="~/Admin/EditPosts.aspx" title="Edit Posts"  description=""></siteMapNode>
          <siteMapNode url="~/Admin/ApproveComments.aspx" title="Approve Comments"  description=""></siteMapNode>
        </siteMapNode>
    </siteMapNode>
</siteMap>

master page

protected void Menu1_MenuItemDataBound(object sender, MenuEventArgs e)
{
    if (!HttpContext.Current.User.Identity.IsAuthenticated)
    {
        System.Web.UI.WebControls.Menu menu = (System.Web.UI.WebControls.Menu)sender;
        SiteMapNode mapNode = (SiteMapNode)e.Item.DataItem;

        System.Web.UI.WebControls.MenuItem itemToRemove = menu.FindItem(mapNode.Title);

        if (mapNode.Title == "Admin Panel")
        {
            System.Web.UI.WebControls.MenuItem parent = e.Item.Parent;
            if (parent != null)
            {
                parent.ChildItems.Remove(e.Item);
            }
        }
    }
}

markup

    <asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1" 
        Orientation="Horizontal" onmenuitemdatabound="Menu1_MenuItemDataBound">
    </asp:Menu>
    <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" 
        ShowStartingNode="False" />

I tired the code above, but it is not working. It looks like, the parent for "Admin Panel" is null. But i don't know how to modify it to make it work.

I also tried a simply version:

Menu1.Items.RemoveAt(2);

Not sure why it gave me index out of bound error. The Admin Panel item is really the 3rd item in Menu1 though.

Any help would be appreciated.

Upvotes: 1

Views: 16811

Answers (3)

grgbar
grgbar

Reputation: 11

Since you may be not sure where itemToRemove is located you may just remove it from it's parent like this:

protected void TopNavigationMenu_OnMenuItemDataBound(object sender, MenuEventArgs e)
    {
        System.Web.UI.WebControls.Menu menu = (System.Web.UI.WebControls.Menu)sender;
        SiteMapNode mapNode = (SiteMapNode)e.Item.DataItem;
        if (mapNode.Title == "Admin Dash" && currUser != null && currUser.UserGroups.FirstOrDefault(s=>s.GroupID == 0) == null)
        {
            System.Web.UI.WebControls.MenuItem itemToRemove = menu.FindItem("Compliance/Admin Dash");
            itemToRemove.Parent.ChildItems.Remove(itemToRemove);
            // menu.Items.Remove(itemToRemove);
        }
    }

please note line: itemToRemove.Parent.ChildItems.Remove(itemToRemove);

Upvotes: 1

Kevin M
Kevin M

Reputation: 1110

Could do this 2 ways:

MarkUp:

<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" 
                EnableViewState="False" IncludeStyleBlock="False" Orientation="Horizontal" 
                DataSourceID="SiteMapDataSource1" 
                onmenuitemdatabound="NavigationMenu_MenuItemDataBound">
</asp:Menu>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" />

Code:

protected void NavigationMenu_MenuItemDataBound(object sender, MenuEventArgs e)
{
    System.Web.UI.WebControls.Menu menu = (System.Web.UI.WebControls.Menu)sender;
    SiteMapNode mapNode = (SiteMapNode)e.Item.DataItem;

    if (mapNode.Title == "Admin Panel")
    {            
        System.Web.UI.WebControls.MenuItem itemToRemove = menu.FindItem(mapNode.Title);
        menu.Items.Remove(itemToRemove);
    }
}

Markup:

<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" 
                EnableViewState="False" IncludeStyleBlock="False" Orientation="Horizontal" 
                DataSourceID="SiteMapDataSource1" ondatabound="NavigationMenu_DataBound" >
</asp:Menu>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" />

Code:

protected void NavigationMenu_DataBound(object sender, EventArgs e)
{
    ((System.Web.UI.WebControls.Menu)sender).Items.RemoveAt(2);
}

Upvotes: 6

Mikael &#214;stberg
Mikael &#214;stberg

Reputation: 17156

If you are trying to use the Menu1.Items.RemoveAt(2); method in the Menu1_MenuItemDataBound event handler, I think you are to late.

You need to do it before, such as at the Page_Load event.

Upvotes: 0

Related Questions