Отображение дочерних элементов текущего узла в статическом ASP:Menu

Я пытаюсь построить вертикальное статическое меню ASP из файла SiteMap, в котором дочерние элементы для узла отображаются только в том случае, если они или их родительский узел в данный момент выбраны. Например, скажем, мой SiteMap это:

Элемент1
Элемент2
- ребенок2.1
- ребенок2,2
Item3
- ребенок3.1
- ребенок3,2

На домашней странице (Item1) я хочу, чтобы мое статическое меню отображалось как:

Элемент1
Элемент2
Item3

Находясь на странице Item2 или Child2.1, я хочу, чтобы мое статическое меню выглядело как:

Элемент1
Элемент2
- ребенок2.1
- ребенок2,2
Item3

Я пытаюсь сделать это программно в MasterPage во время Menu_DataBound, но до сих пор не удалось. Поскольку в основной навигации моего сайта уже используются динамические меню, я не хочу использовать их в этой навигации второго уровня.

Вместо использования меню asp: я попытался создать код в метке:

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, однако я несколько недель пытался найти решение. Конечно, я просто ищу неправильные ключевые слова.

1 ответ

Догадаться. Делимся на благо Это оценивает каждый элемент в меню во время события 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">
Другие вопросы по тегам