ASP.NET站点地图作为下拉菜单显示非子元素的问题

时间:2011-09-27 11:31:29

标签: asp.net sitemap drop-down-menu

我有一个带有单级下拉菜单的asp.net站点地图。我在母版页中使用以下代码,通过生成<li><ul>将其显示为下拉菜单。它工作正常的问题是,即使某些项目没有子项目,它生成为空,这会导致显示下拉图标。  如何通过检查子节点数来停止空<ul>代。

    <!---  Menu -->
         <div id="horizontalcssmenu" class="horizontalcssmenu">
           <asp:SiteMapDataSource  ID="SiteMapDataSource1" ShowStartingNode="false" runat="server" />
                    <ul id="cssmenu1">
                        <li><a id="A1" href="index.aspx" runat="server">Home</a></li>

                        <asp:Repeater ID="foo" DataSourceID="SiteMapDataSource1" EnableViewState="false" 
                                        runat="server" onitemcommand="foo_ItemCommand">
                            <ItemTemplate>
                                <li>
                                    <a href='<%#Eval("url") %>'><%#Eval("Title") %></a>
                                    <ul>
                                        <asp:Repeater ID="bar" DataSource='<%# ((SiteMapNode) Container.DataItem).ChildNodes %>' runat="server">
                                            <ItemTemplate>
                                                <li><a href='<%#Eval("url") %>'><%#Eval("Title") %></a></li>
                                            </ItemTemplate>
                                        </asp:Repeater>
                                    </ul>

                                </li>
                            </ItemTemplate>
                        </asp:Repeater>
                    </ul>
                </div>
  <!-- Menu End -->

enter image description here

输出代码显示如下

   <!---  Menu -->
         <div id="horizontalcssmenu" class="horizontalcssmenu">
                    <ul id="cssmenu1">
                        <li><a href="index.aspx" id="ctl00_A1">Home</a></li>
                                <li>
                                    <a href='/SVSS/StudentFullDetails.aspx'>Student Details</a>
                                    <ul>
                                    </ul>
                                </li>
                                <li>
                                    <a href='/SVSS/StudentMonthlyAttendance.aspx'>Attendance</a>
                                    <ul>
                                    </ul>
                                </li>
                                <li>
                                    <a href='/SVSS/MyNotice.aspx'>Notice</a>
                                    <ul>
                                    </ul>

                                </li>

                    </ul>
                </div>
                <!-- Menu End -->

3 个答案:

答案 0 :(得分:2)

如下:

<%if(((SiteMapNode) Container.DataItem).ChildNodes.Length > 0) { %>
    <ul>
        <asp:Repeater ID="bar" DataSource='<%# ((SiteMapNode) Container.DataItem).ChildNodes %>' runat="server">
            <ItemTemplate>
                <li><a href='<%#Eval("url") %>'><%#Eval("Title") %></a></li>
            </ItemTemplate>
        </asp:Repeater>
    </ul>
<%}>

答案 1 :(得分:1)

有点晚了,但可能会帮助别人。 尝试设置转发器的Visible属性,如下所示。

Visible="<%# ((SiteMapNode)Container.DataItem).ChildNodes.Count > 0 ? true : false %>"

答案 2 :(得分:0)

重要的是-> If(CType(Container.DataItem,SiteMapNode).HasChildNodes 它对引导导航栏有好处 需要为活动节点添加活动

            <nav class="navbar navbar-expand-sm navbar-toggleable-sm bg-white navbar-light border-bottom box-shadow mb-3">
                <a id="HlBrand" href="#" class="navbar-brand" title="xx">
                    logo
                </a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <div class="navbar-collapse collapse" role="navigation" id="navbarText">
                    <ul class="navbar-nav ml-auto" role="menu">
                        <%--<li>
                            <asp:HyperLink runat="server" CssClass="nav-link" ID="lnkHome" NavigateUrl="~/">Home</asp:HyperLink>
                        </li>--%>
                        <asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1">
                            <ItemTemplate>
                                <li class="nav-item dropdown">
                                    <%--<%# If(CType(Container.DataItem, SiteMapNode).HasChildNodes, "nav-link dropdown-toggle", "nav-link")%>--%>
                                    <asp:HyperLink ID="lnkMenuItem" CssClass='<%# If(CType(Container.DataItem, SiteMapNode).HasChildNodes, "nav-link dropdown-toggle", "nav-link")%>' data-toggle="dropdown" aria-expanded="false" aria-haspopup="true" runat="server" title='<%# Eval("description") %>' NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>


                                    <asp:Repeater ID="submenu" runat="server" DataSource="<%# CType(Container.DataItem, SiteMapNode).ChildNodes %>">
                                        <HeaderTemplate>
                                            <div role="menu" aria-labelledby="" class="dropdown-menu">
                                        </HeaderTemplate>
                                        <ItemTemplate>

                                            <asp:HyperLink ID="lnkMenuItem" CssClass="dropdown-item" runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>

                                        </ItemTemplate>
                                        <FooterTemplate>
                                            </div>
                                        </FooterTemplate>
                                    </asp:Repeater>

                                </li>
                            </ItemTemplate>
                        </asp:Repeater>
                    </ul>
                </div>
            </nav>
            <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" />