在静态ASP:菜单中显示当前节点的子项

时间:2012-04-18 15:35:12

标签: asp.net menu parent-child menuitem aspmenu

我正在尝试从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中构建,但是我已经尝试了几周才找到解决方案。当然,我可能只是在寻找错误的关键词。

1 个答案:

答案 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">