我有一个使用我的母版页中的站点地图的菜单。我想根据用户禁用某些菜单项。在任何情况下,我都不想进入 MS“角色”的兔子洞。
我有以下 Site.Master:
<div class="clear hideSkiplink">
<asp:Menu ID="MainMenu" runat="server" DataSourceID="SiteMapDataSource1"
Orientation="Horizontal"
CssClass="menu"
StaticDisplayLevels="1"
StaticMenuItemStyle-VerticalPadding="2"
StaticMenuItemStyle-HorizontalPadding="10"
StaticMenuItemStyle-Font-Name="Verdana"
StaticMenuItemStyle-Font-Size="12pt"
StaticHoverStyle-BackColor="#707070"
StaticHoverStyle-ForeColor="#550000"
DynamicMenuStyle-HorizontalPadding="2"
DynamicMenuStyle-VerticalPadding="2"
DynamicMenuStyle-BackColor="#E0E0E0"
DynamicMenuStyle-ForeColor="#FFFFFF"
DynamicMenuStyle-BorderWidth="1"
DynamicMenuStyle-BorderColor="#C0C0C0"
DynamicMenuItemStyle-VerticalPadding="2"
DynamicMenuItemStyle-Font-Name="Verdana"
DynamicMenuItemStyle-Font-Size="9pt"
DynamicMenuItemStyle-ForeColor="#FFFFFF"
DynamicHoverStyle-BackColor="#707070"
DynamicHoverStyle-ForeColor="#550000" />
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="False" />
我有类似于以下内容的 web.sitemap:
<siteMapNode >
<siteMapNode url="default.aspx" title="Home" description="" />
<siteMapNode url="default.aspx?p=0" title="Admin" description="">
<siteMapNode url="default.aspx?p=55" title="thing1" description="" />
<siteMapNode url="default.aspx?p=56" title="thing2" description="" />
</siteMapNode>
<siteMapNode url="default.aspx?p=1" title="Thing3" description="">
</siteMapNode>
<siteMapNode url="default.aspx?p=2" title="Thing4" description="">
</siteMapNode>
</siteMapNode>
在 Site.Master.cs 中,我尝试在 Page_Load 和 MainMenu_MenuItemDataBound 下添加以下代码:
Response.Write(MainMenu.Items.Count.ToString());
当我把它放在 MainMenu_MenuItemDataBound 下时,它没有效果。当我将它放在 Page_Load() 下时,它打印为零,即使我可以看到正确显示的菜单并且它确实有项目!
事实:菜单存在。菜单有项目。菜单和项目显示正确。
我想进入,例如,使标题为“Admin”的项目不可见(连同它的子菜单项目) - 我想删除它,但要么让它不可见,要么禁用它。我已经尝试过涉及 MainMenu.FindItem 的各种咒语......该方法似乎与查找项目没有任何关系。这是当我注意到它没有找到任何项目的原因是因为项目计数为零(即使我可以看到这些项目)。
根据下面的 Dave D 解决方案,但还需要添加
OnMenuItemDataBound="MainMenu_MenuItemDataBound"
到 MainMenu 标签。