Отображение дочерних элементов текущего узла в статическом 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">