Reputation: 2198
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
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
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
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