【问题标题】:Making menu items invisible from on the master page使菜单项在母版页上不可见
【发布时间】:2012-04-18 15:47:57
【问题描述】:

我有一个使用我的母版页中的站点地图的菜单。我想根据用户禁用某些菜单项。在任何情况下,我都不想进入 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 标签。

【问题讨论】:

    标签: asp.net menu master-pages sitemap


    【解决方案1】:

    菜单不会绑定到 page_load 中的数据。这就是它没有计数的原因。

    在绑定时检查 MenuItemDataBound 中的项目可以这样完成:

    protected void MainMenu_MenuItemDataBound(Object sender, MenuEventArgs e)
    {
    
        if (e.Item.Text == "Admin")
        {
            // disable the item
            //e.Item.Enabled = false;
    
            // remove the menu item
            MainMenu.Items.Remove(e.Item);
    
        }
    }
    

    【讨论】:

    • 没用。据我所知,MainMenu_MenuItemDataBound 从未被调用过。
    • 啊!秘密是我需要将 OnMenuItemDataBound="MainMenu_MenuItemDataBound" 添加到 MainMenu 的标签中。所以你的解决方案确实有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多