2010-10-19 17 views
6

Uruchomiłem nową aplikację ASP.NET 4 WebForm. Domyślnie, plik Site.Master zawiera następujące menu:Utwórz menu z pliku web.sitemap w ASP.NET

<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal"> 
    <Items> 
    <asp:MenuItem NavigateUrl="~/Default.aspx" Text="Home"/> 
    <asp:MenuItem NavigateUrl="~/About.aspx" Text="About"/> 
    </Items> 
</asp:Menu> 

To menu zawiera dwa bloki: "Home" i "O". Podoba mi się ta struktura. Jednak chcę wypełnić NavigationMenu w oparciu o zawartość mojego pliku Web.sitemap. W tym czasie, plik ten wygląda następująco:

<?xml version="1.0" encoding="utf-8" ?> 
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 
    <siteMapNode> 
    <siteMapNode url="/Default.aspx" title="Home" description=""></siteMapNode> 
    <siteMapNode url="/Products/List.aspx" title="Products" description=""></siteMapNode> 
    </siteMapNode> 
</siteMap> 

Zmieniłem kod NavigationMenu aby wyglądać następująco:

<asp:SiteMapDataSource ID="mySiteMapDataSource" runat="server" /> 
<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" DataSourceID="mySiteMapDataSource" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal" /> 

Moim problemem jest to, takie podejście stwarza mały blok, który reprezentuje menu. Gdy użytkownik się nad tym unosi, dwa elementy podmenu pojawiają się jako "Dom" i "Produkty". Co dziwne, plik web.sitemap obsługuje tylko jeden element siteMapNode jako element potomny elementu siteMap. Jak mogę sprawić, aby "Strona główna" i "Produkty" wyglądały tak samo, jak "Dom" i "Informacje", zapewniając jednocześnie elastyczność korzystania z mapy witryny?

Dziękujemy!

Odpowiedz

0

Powinieneś zrezygnować z asp: Menu i powtórzyć mapę witryny, korzystając z ListView i wygenerować własne menu. Chciałbym użyć standardowego tagu ul. Następnie połącz "li", "ul" i "a" z css dla stylizacji.

<asp:ListView ID="lvMenuList" DataSourceID="SiteMapDataSource1" runat="server"> 
     <LayoutTemplate> 
       <li runat="server" /> 
     </LayoutTemplate> 
     <ItemTemplate> 
       <li> <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("Url") %>'><span><%# Eval("Title") %></span></asp:HyperLink>       
      <asp:ListView ID="ListView2" runat="server" DataSource='<%# ((SiteMapNode) Container.DataItem).ChildNodes %>' > 
     <LayoutTemplate> 
       <ul><li runat="server" /></ul> 
     </LayoutTemplate> 
     <ItemTemplate> 
       <li> <asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl='<%# Eval("Url") %>'><span><%# Eval("Title") %></span></asp:HyperLink> </li> 
     </ItemTemplate> 
</asp:ListView> 

         </li> 
        </ItemTemplate> 
        </asp:ListView> 

To zajmie plik mapy witryny, który ma dwa poziomy, będziesz musiał dodać dodatkowy listview, jeśli masz 3 poziomy.

Ponadto, możesz mieć więcej niż 2 poziomy, tutaj jest link do msdn, który pokazuje przykład używając 3 poziomów: https://msdn.microsoft.com/en-us/library/yy2ykkab%28v=vs.140%29.aspx