从ASP.NET中的web.sitemap文件构建菜单

时间:2010-10-19 14:03:10

标签: asp.net

我已经开始使用新的ASP.NET 4 WebForm应用程序了。默认情况下,Site.Master文件包含以下菜单:

<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>

此菜单包含两个块:“Home”和“About”。我喜欢这种结构。但是,我想根据我的Web.sitemap文件的内容填充NavigationMenu。目前,此文件如下所示:

<?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>

我将NavigationMenu代码更改为如下所示:

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

我的问题是,这种方法会创建一个代表菜单的小块。当用户将鼠标悬停在此时,两个子菜单项将显示“Home”和“Products”。奇怪的是,web.sitemap文件只允许一个siteMapNode作为siteMap元素的子项。我如何使“Home”和“Products”以“Home”和“About”的方式出现,同时让我灵活地使用站点地图?

谢谢!

3 个答案:

答案 0 :(得分:3)

对我来说ShowStartingNode =“false”效果更好。

答案 1 :(得分:2)

您可以使用 SitemapDataSource 控件的 StartingNodeOffset 属性来调整公开的站点地图层次结构的哪个部分。在你的情况下,如果你把它设置为1,一切都应该没问题。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sitemapdatasource.startingnodeoffset.aspx

答案 2 :(得分:0)

你应该抛弃asp:Menu并使用ListView迭代站点地图并生成你自己的菜单。我会使用标准的ul标签。然后打上&#34; li&#34;,&#34; ul&#34;和&#34; a&#34;用于造型。

<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>

这将处理两个级别的站点地图文件,如果您有3个级别,则必须添加其他列表视图。

此外,你可以有两个以上的关卡,这里有一个指向msdn的链接,它显示了一个使用3个级别的问题:https://msdn.microsoft.com/en-us/library/yy2ykkab%28v=vs.140%29.aspx