我正在尝试从SiteMap文件构建一个垂直的静态ASP菜单,其中节点的子项仅在当前选中它们或它们的父节点时显示。例如,假设我的SiteMap是:
的Item1
项目2
- Child2.1
- Child2.2
项目3
- Child3.1
- Child3.2
在主页(Item1)上,我希望我的静态菜单显示为:
的Item1
项目2
项目3
如果我在Item2或Child2.1页面上,我希望我的静态菜单显示为:
的Item1
项目2
- Child2.1
- Child2.2
项目3
我正在尝试在Menu_DataBound期间以编程方式在MasterPage中执行此操作,但到目前为止已失败。由于我网站的主要导航已采用动态菜单,我不希望在这个第二层导航中使用它们。
代替使用asp:Menu,我尝试在Label中构建代码:
Protected Sub LeftNavMenu_DataBound(sender As Object, e As System.EventArgs) Handles
LeftNavMenu.DataBound
If LeftNavMenu.Items.Count > 0 Then
Dim item As MenuItem
For Each item In LeftNavMenu.Items
DisplayChildMenuText(item)
Next
Else
lblNav.Text = "The Menu control does not have any items."
End If
End Sub
Sub DisplayChildMenuText(ByVal item As MenuItem)
If item.Selected Then
lblNav.Text &= "<li><span class=""active""></span><a href=""" & item.NavigateUrl & """>" & item.Text & "</a></li>"
If item.ChildItems.Count > 0 Then
Dim childItem As MenuItem
lblNav.Text &= "<ul>"
For Each childItem In item.ChildItems
lblNav.Text &= "<li><a href=""" & childItem.NavigateUrl & """>" & childItem.Text & "</a></li>"
Next
lblNav.Text &= "</ul>"
End If
Else
lblNav.Text &= "<li><a href=""" & item.NavigateUrl & """>" & item.Text & "</a></li>"
End If
End Sub
如果我在顶层链接(Item2,Item3)上,则会显示正确的导航,但如果我选择子页面则会失败。
如果在其他地方得到回答,我真诚地道歉。这似乎是一个相当基本的要求,应该在ASP Menus中构建,但是我已经尝试了几周才找到解决方案。当然,我可能只是在寻找错误的关键词。
答案 0 :(得分:0)
想出来。分享更大的利益。这会在MenuItemDataBound事件期间评估菜单中的每个项目,检查项目是否为子项,检查它是否在活动节点中,如果不是,则将其删除。
<script runat="server">
Protected Sub Menu1_MenuItemDataBound(sender As Object, e As System.Web.UI.WebControls.MenuEventArgs) Handles Menu1.MenuItemDataBound
If e.Item.Parent IsNot Nothing Then
If e.Item.Parent.Text <> SiteMap.CurrentNode.Title And e.Item.Parent.Text <> SiteMap.CurrentNode.ParentNode.Title Then
e.Item.Parent.ChildItems.Remove(e.Item)
End If
End If
End Sub
</script>
确保您的菜单设置为显示两个StaticDisplayLevels,例如:
<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1" IncludeStyleBlock="False"
MaximumDynamicDisplayLevels="0" SkipLinkText="" StaticDisplayLevels="2">