0

我正在尝试从 SiteMap 文件构建一个垂直的静态 ASP 菜单,其中节点的子项仅在当前选择它们或其父节点时才显示。例如,假设我的 SiteMap 是:

Item1
Item2
- Child2.1
- Child2.2
Item3
- Child3.1
- Child3.2

在主页 (Item1) 上,我希望我的静态菜单显示为:

项目
1 项目 2
项目 3

如果我在 Item2 或 Child2.1 页面上,我希望我的静态菜单显示为:

Item1
Item2
- Child2.1
- Child2.2
Item3

我试图在 Menu_DataBound 期间在 MasterPage 中以编程方式执行此操作,但到目前为止都失败了。由于我网站的主导航已经使用了动态菜单,我不希望在这个二级导航中使用它们。

代替使用 asp:Menu,我尝试在标签中构建代码:

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 菜单中,但是我已经尝试了数周来寻找解决方案。当然,我可能只是在搜索错误的关键字。

4

1 回答 1

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>

确保您的菜单设置为显示两个 StaticDisplayLevel,例如:

<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1" IncludeStyleBlock="False"
    MaximumDynamicDisplayLevels="0" SkipLinkText="" StaticDisplayLevels="2">
于 2012-04-19T00:41:34.610 回答