C# 从ASP.NET菜单中删除菜单
我正在研究某人留下的密码 这是一个ASP.NET网络表单应用程序。对于许多角色 定义了 他在没有菜单项的母版页上定义菜单基础结构C# 从ASP.NET菜单中删除菜单,c#,asp.net,vb.net,C#,Asp.net,Vb.net,我正在研究某人留下的密码 这是一个ASP.NET网络表单应用程序。对于许多角色 定义了 他在没有菜单项的母版页上定义菜单基础结构 <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" /> <asp:Menu ID="Menu1" CssClass="noflicker" runat="server"
<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>
我知道,若菜单是使用Menuitems定义的,那个么很容易删除它们
但是,使用sitemap有没有办法删除菜单上的项目
目前,我知道的唯一方法是为不同的角色定义不同的站点地图,这绝对不是一个好的解决方案,这里有一个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;
}
}
}
一旦它被填充,你可以在菜单中循环(匹配菜单文本?)并删除项目-仍然不是最佳选择solution@Kevin,我认为这比定义不同的站点地图要好。@kevin,SiteMapDataSource1.SiteMapProvider=“allMenuItemsSiteMap”;似乎不会自行填充菜单,项目数返回为0 try Menu1.items这可能有用,但问题是Menu.items.Count始终显示为1(仅第一项)。我尝试访问菜单预渲染事件上的菜单。如果这不正确,它应该在哪里?我在页面加载时这样做,菜单还没有在菜单中构建。\u Prerender event至少比使用站点地图更好!很高兴它有帮助!
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;
}
}
}