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 でこれをプログラムで実行しようとしていますが、これまでのところ失敗しています。私のサイトのメイン ナビゲーションは既に動的メニューを採用しているため、この第 2 層のナビゲーションには採用したくありません。

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 メニューに組み込まれるべきもののように思えますが、解決策を見つけるために何週間も試みました。確かに、間違ったキーワードを検索しているだけかもしれません。

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>

メニューが 2 つの StaticDisplayLevels を表示するように設定されていることを確認してください。

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