【问题标题】:Removing menus from ASP.NET menu从 ASP.NET 菜单中删除菜单
【发布时间】:2019-02-18 17:10:02
【问题描述】:

我正在处理某人留下的代码。

这是一个 ASP.NET WebForm 应用程序。对于授权许多角色 已定义。

他在没有 MenuItems 的母版页上定义了 Menu 基础结构。

 <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
                            <asp:Menu ID="Menu1" CssClass="noflicker" runat="server"
                                Orientation="Horizontal" StaticDisplayLevels="2" OnMenuItemClick="Menu1_MenuItemClick" DataSourceID="SiteMapDataSource1">
                                <StaticMenuStyle BorderStyle="None" />
                                <StaticSelectedStyle BackColor="#1e1a53" ForeColor="white" Height="25px" Font-Size="18px" Font-Names="Arial" />
                                <StaticMenuItemStyle HorizontalPadding="14px" BorderStyle="None" BorderWidth="1px" Font-Size="18px" ForeColor="White" Height="25px" Font-Bold="False" Font-Names="Arial" />
                                <StaticHoverStyle Height="25px" Font-Names="Arial" ForeColor="white" BackColor="#F99D1C" BorderColor="#3366CC" />
                                <DynamicHoverStyle Height="35px" Font-Names="Arial" ForeColor="white" BackColor="#F99D1C" Font-Size="18px" />
                                <DynamicMenuStyle BorderStyle="Solid" BorderColor="#1e1a53" BorderWidth="1px" Height="25px"
                                    Font-Names="Arial" ForeColor="White" BackColor="#1e1a53" VerticalPadding="3px" />
                                <DynamicSelectedStyle Height="35px" Font-Names="Arial" BorderColor="#1e1a53" BorderWidth="1px" ForeColor="White" BackColor="#1e1a53" />
                                <DynamicMenuItemStyle BorderStyle="Solid" BorderWidth="1px" BorderColor="#1e1a53" Height="35px"
                                    ForeColor="White" BackColor="#1e1a53" HorizontalPadding="3px" Font-Bold="False" Font-Size="18px"
                                    Font-Names="Arial" CssClass="leftMenuItem" VerticalPadding="5px" ItemSpacing="3px" />
                                <DataBindings>
                                    <asp:MenuItemBinding DataMember="SiteMapNode" TextField="Title" ToolTipField="description" />
                                </DataBindings>
                            </asp:Menu>

菜单在运行时使用站点地图填充:

 SiteMapDataSource1.SiteMapProvider = "allMenuItemsSiteMap";

我知道如果 Menu 是使用 Menuitems 定义的,那么删除它们很容易。

但是,使用站点地图有没有办法删除菜单上的项目?

目前,我知道的唯一方法是为不同的角色定义不同的站点地图,这绝对不是一个好的解决方案,

【问题讨论】:

  • 填充后,您可以遍历菜单(匹配菜单文本?)并删除项目 - 仍然不是最佳解决方案
  • @Kevin,我认为这比定义不同的站点地图要好。
  • @kevin , SiteMapDataSource1.SiteMapProvider = "allMenuItemsSiteMap";似乎本身并没有填充菜单,项目数返回为 0
  • 试试 Menu1.Items

标签: c# asp.net vb.net


【解决方案1】:

这是一个C#函数,应该很容易转换成vb.net。如果您有两个以上的深度菜单,则需要将其更改为递归。

private void RemoveMenuItem(string itemText, Menu menu)
{
   foreach (MenuItem menuItem in menu.Items)
   {
      if (menuItem.Text.Equals(itemText, StringComparison.CurrentCultureIgnoreCase))
      {
           menu.Items.Remove(menuItem);
           break;
      }

      bool found = false;

      if (menuItem.ChildItems.Count > 0) RemoveChildMenuItem(itemText, menuItem, out found);

      if (found) break;
    }
}

private void RemoveChildMenuItem(string itemText, MenuItem mi, out bool Found)
{
      Found = false;

      foreach(MenuItem menuItem in mi.ChildItems)
      {
         if (menuItem.Text.Equals(itemText, StringComparison.CurrentCultureIgnoreCase))
        {
            mi.ChildItems.Remove(menuItem);
            Found = true;
            break;
        }                
     }
}

【讨论】:

  • 这可能很有用,但问题是 Menu.Items.Count 始终显示为 1(仅第一项)。我尝试访问 Menu_Prerender 事件的菜单。如果这不正确,它应该在哪里?
  • 我在 Page_Load 上做,菜单还没有在 Menu_Prerender 事件中构建
  • 至少比使用站点地图好!
  • 很高兴它有帮助!
猜你喜欢
  • 2014-01-06
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多