ASP.NET Tutorial/Development/Site Maps

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Adding nodes to a Site Map dynamically.

   <source lang="csharp">

<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <title>About</title>

</head> <body>

   <form id="form1" runat="server">
   <asp:SiteMapPath
       id="SiteMapPath1"
       Runat="server" />

About Our Company

   </form>

</body> </html> File: Web.sitemap

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" > <siteMapNode

 url="Default.aspx"
 title="Home"
 description="The Home Page">
 <siteMapNode
   url="Default1.aspx"
   title="Our Products"
   description="Products that we offer">
   <siteMapNode
     url="FirstProduct.aspx"
     title="First Product"
     description="The description of the First Product" />
   <siteMapNode
     url="SecondProduct.aspx"
     title="Second Product"
     description="The description of the Second Product" />
 </siteMapNode>
 <siteMapNode
   url="Default2.aspx"
   title="Our Services"
   description="Services that we offer">
   <siteMapNode
     url="FirstService.aspx"
     title="First Service"
     description="The description of the First Service"
     metaDescription="The first service" />
   <siteMapNode
     url="SecondService.aspx"
     title="Second Service"
     description="The description of the Second Service" />
 </siteMapNode>

</siteMapNode> </siteMap></source>


Creating a custom navigation display using the CurrentNode property (C#)

   <source lang="csharp">

<%@ Page Language="C#" %> <script runat="server">

   protected void Page_Load(object sender, System.EventArgs e)
   {
       Hyperlink1.Text = SiteMap.CurrentNode.ParentNode.ToString();
       Hyperlink1.NavigateUrl = SiteMap.CurrentNode.ParentNode.Url;
       
       Hyperlink2.Text = SiteMap.CurrentNode.PreviousSibling.ToString();
       Hyperlink2.NavigateUrl = SiteMap.CurrentNode.PreviousSibling.Url;
       
       Hyperlink3.Text = SiteMap.CurrentNode.NextSibling.ToString();
       Hyperlink3.NavigateUrl = SiteMap.CurrentNode.NextSibling.Url;
   }

</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">

   <title>SiteMapDataSource</title>

</head> <body>

   <form id="form1" runat="server">
       Move Up:
       <asp:Hyperlink ID="Hyperlink1" Runat="server"></asp:Hyperlink>
<asp:Hyperlink ID="Hyperlink2" Runat="server"></asp:Hyperlink> | <asp:Hyperlink ID="Hyperlink3" Runat="server"></asp:Hyperlink> </form>

</body> </html>

File: Web.sitemap <?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" >

  <siteMapNode title="Home" description="Home Page" url="Default.aspx">
     <siteMapNode title="News" description="The Latest News" url="News.aspx">
        <siteMapNode title="U.S." description="U.S. News" url="News.aspx?cat=us" />
        <siteMapNode title="World" description="World News" url="News.aspx?cat=world" />
        <siteMapNode title="Technology" description="Technology News" url="News.aspx?cat=tech" />
        <siteMapNode title="Sports" description="Sports News" url="News.aspx?cat=sport" />
     </siteMapNode>
     <siteMapNode title="Weather" description="The Latest Weather" url="Weather.aspx" />
  </siteMapNode>

</siteMap></source>


Creating a custom navigation display using the CurrentNode property (VB)

   <source lang="csharp">

<%@ Page Language="VB" %> <script runat="server" language="vb">

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)   
       Hyperlink1.Text = SiteMap.CurrentNode.ParentNode.ToString()
       Hyperlink1.NavigateUrl = SiteMap.CurrentNode.ParentNode.Url
       
       Hyperlink2.Text = SiteMap.CurrentNode.PreviousSibling.ToString()
       Hyperlink2.NavigateUrl = SiteMap.CurrentNode.PreviousSibling.Url
       
       Hyperlink3.Text = SiteMap.CurrentNode.NextSibling.ToString()
       Hyperlink3.NavigateUrl = SiteMap.CurrentNode.NextSibling.Url
   End Sub

</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">

   <title>SiteMapDataSource</title>

</head> <body>

   <form id="form1" runat="server">
       Move Up:
       <asp:Hyperlink ID="Hyperlink1" Runat="server"></asp:Hyperlink>
<asp:Hyperlink ID="Hyperlink2" Runat="server"></asp:Hyperlink> | <asp:Hyperlink ID="Hyperlink3" Runat="server"></asp:Hyperlink> </form>

</body> </html> File: Web.sitemap <?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" >

  <siteMapNode title="Home" description="Home Page" url="Default.aspx">
     <siteMapNode title="News" description="The Latest News" url="News.aspx">
        <siteMapNode title="U.S." description="U.S. News" url="News.aspx?cat=us" />
        <siteMapNode title="World" description="World News" url="News.aspx?cat=world" />
        <siteMapNode title="Technology" description="Technology News" url="News.aspx?cat=tech" />
        <siteMapNode title="Sports" description="Sports News" url="News.aspx?cat=sport" />
     </siteMapNode>
     <siteMapNode title="Weather" description="The Latest Weather" url="Weather.aspx" />
  </siteMapNode>

</siteMap></source>


Creating Custom Site Map Attributes

   <source lang="csharp">

Any custom attributes that you add to a Site Map are exposed by instances of the SiteMapNode class. File: Web.sitemap <siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" > <siteMapNode

 url="Default.aspx"
 title="Home"
 description="The Home Page">
 <siteMapNode
   url="Default1.aspx"
   title="Our Products"
   description="Products that we offer">
   <siteMapNode
     url="FirstProduct.aspx"
     title="First Product"
     description="The description of the First Product" />
   <siteMapNode
     url="SecondProduct.aspx"
     title="Second Product"
     description="The description of the Second Product" />
 </siteMapNode>
 <siteMapNode
   url="Default2.aspx"
   title="Our Services"
   description="Services that we offer">
   <siteMapNode
     url="FirstService.aspx"
     title="First Service"
     description="The description of the First Service"
     metaDescription="The first service" />
   <siteMapNode
     url="SecondService.aspx"
     title="Second Service"
     description="The description of the Second Service" />
 </siteMapNode>

</siteMapNode> </siteMap>


File: FirstService.aspx <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <script runat="server">

   void Page_Load()
   {
       HtmlMeta meta = new HtmlMeta();
       meta.Name = "Description";
       meta.Content = SiteMap.CurrentNode["metaDescription"];
       head1.Controls.Add(meta);
   }

</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="head1" runat="server">

   <title>First Service</title>

</head> <body>

   <form id="form1" runat="server">

The First Service

   </form>

</body> </html></source>


Creating the AutoSiteMapProvider

   <source lang="csharp">

File: App_Code/AutoSiteMapProvider.cs using System; using System.Collections.Generic; using System.IO; using System.Web; using System.Web.Caching; namespace MyNamespace {

   public class AutoSiteMapProvider : StaticSiteMapProvider
   {
       private SiteMapNode _rootNode;
       private static List<string> _excluded = new List<string>();
       private List<string> _dependencies = new List<string>();
       static AutoSiteMapProvider()
       {
           _excluded.Add("app_code");
           _excluded.Add("app_data");
           _excluded.Add("app_themes");
           _excluded.Add("bin");
       }
       protected override SiteMapNode GetRootNodeCore()
       {
           return BuildSiteMap();        
       }
       public override SiteMapNode BuildSiteMap()
       {
           lock (this)
           {
               HttpContext context = HttpContext.Current;
               _rootNode = (SiteMapNode)context.Cache["RootNode"];
               if (_rootNode == null)
               {
                   Clear();
                   string folderUrl = HttpRuntime.AppDomainAppVirtualPath;
                   string defaultUrl = folderUrl + "/Default.aspx";
                   _rootNode = new SiteMapNode(this, folderUrl, defaultUrl, "Home");
                   AddNode(_rootNode);
                   AddChildNodes(_rootNode);
                   _dependencies.Add(HttpRuntime.AppDomainAppPath);
                   CacheDependency fileDependency = new CacheDependency(_dependencies.ToArray());
                   context.Cache.Insert("RootNode", _rootNode, fileDependency);
               }
               return _rootNode;
           }
       }
       private void AddChildNodes(SiteMapNode parentNode)
       {
           AddChildFolders(parentNode);
           AddChildPages(parentNode);
       }        
       private void AddChildFolders(SiteMapNode parentNode)
       {
           HttpContext context = HttpContext.Current;
           string parentFolderPath = context.Server.MapPath(parentNode.Key);
           DirectoryInfo folderInfo = new DirectoryInfo(parentFolderPath);
           DirectoryInfo[] folders = folderInfo.GetDirectories();
           foreach (DirectoryInfo folder in folders)
           {
               if (!_excluded.Contains(folder.Name.ToLower()))
               {
                   string folderUrl = parentNode.Key + "/" + folder.Name;
                   SiteMapNode folderNode = new SiteMapNode(this, folderUrl, null, GetName(folder.Name));
                   AddNode(folderNode, parentNode);
                   AddChildNodes(folderNode);
                   _dependencies.Add(folder.FullName);
               }
           }
       }
       private void AddChildPages(SiteMapNode parentNode)
       {
           HttpContext context = HttpContext.Current;
           string parentFolderPath = context.Server.MapPath(parentNode.Key);
           DirectoryInfo folderInfo = new DirectoryInfo(parentFolderPath);
           FileInfo[] pages = folderInfo.GetFiles("*.aspx");
           foreach (FileInfo page in pages)
           {
               if (!_excluded.Contains(page.Name.ToLower()))
               {
                   string pageUrl = parentNode.Key + "/" + page.Name;
                   if (String.rupare(pageUrl, _rootNode.Url, true) !=0)
                   {                        SiteMapNode pageNode = new SiteMapNode(this, pageUrl, pageUrl, GetName(page.Name));
                       AddNode(pageNode, parentNode);
                   }
               }
           }
       }
       private string GetName(string name)
       {
           name = Path.GetFileNameWithoutExtension(name);
           return name.Replace("_", " ");
       }
   }

}


File: Web.Config <configuration xmlns="http://schemas.microsoft.ru/.NetConfiguration/v2.0">

   <system.web>
     <siteMap defaultProvider="MyAutoSiteMapProvider">
       <providers>
         <add
           name="MyAutoSiteMapProvider"
           type="MyNamespace.AutoSiteMapProvider" />
       </providers>
     </siteMap>
   </system.web>

</configuration></source>


Defining a Site Map

   <source lang="csharp">

The XmlSiteMapProvider looks for a file named Web.sitemap in the root of the virtual directory. XmlSiteMapProvider extracts the site map data and create the corresponding SiteMap object. This SiteMap object is then made available to the SiteMapDataSource, which you place on every page that uses navigation. Rule 1: Site Maps Begin with the <siteMap> Element. Every Web.sitemap file begins by declaring the <siteMap>. <siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0"> ... </siteMap>

Rule 2: Each Page Is Represented by a <siteMapNode> Element To insert a page into the site map, you add the <siteMapNode> element. You need to supply the title of the page, a description, and the URL. <siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0">

   <siteMapNode title="Home" description="Home" url="~/default.aspx" />

</siteMap> The ~/ characters represent the root folder of your web application.

Rule 3: A <siteMapNode> Element Can Contain Other <siteMapNode> Elements <siteMapNode title="Home" description="Home" url="~/default.aspx">

   <siteMapNode title="Products" description="Our products" url="~/products.aspx" />
   <siteMapNode title="Hardware" description="Hardware choices" url="~/hardware.aspx" />

</siteMapNode> You can omit the url attribute, as shown here with the Products node: <siteMapNode title="Products" description="Products">

   <siteMapNode title="In Stock" description="Products that are available" url="~/inStock.aspx" />
   <siteMapNode title="Not In Stock" description="Products that are on order" url="~/outOfStock.aspx" />

</siteMapNode> Rule 4: Every Site Map Begins with a Single <siteMapNode> A site map must always have a single root node.

Rule 5: Duplicate URLs Are Not Allowed</source>


Displaying an automatically generated Site Map.

   <source lang="csharp">

File: App_Code\SqlSiteMapProvider.cs using System; using System.Collections.Specialized; using System.Web.Configuration; using System.Data; using System.Data.SqlClient; using System.Web; using System.Web.Caching; namespace MyNamespace {

   public class SqlSiteMapProvider : StaticSiteMapProvider
   {
       private bool _isInitialized = false;
       private string _connectionString;
       private SiteMapNode _rootNode;
       public override void Initialize(string name, NameValueCollection attributes)
       {
           if (_isInitialized)                return;
           base.Initialize(name, attributes);
           string connectionStringName = attributes["connectionStringName"];
           if (String.IsNullOrEmpty(connectionStringName))
               throw new Exception("You must provide a connectionStringName attribute");
           _connectionString = WebConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
           if (String.IsNullOrEmpty(_connectionString))
               throw new Exception("Could not find connection string " + connectionStringName);
           _isInitialized = true;
       }
       protected override SiteMapNode GetRootNodeCore()
       {
           return BuildSiteMap();
       }
       public override SiteMapNode BuildSiteMap()
       {
           lock (this)
           {
               HttpContext context = HttpContext.Current;
               _rootNode = (SiteMapNode)context.Cache["RootNode"];
               if (_rootNode == null)
               {
                   HttpContext.Current.Trace.Warn("Loading from database");
                   Clear();
                   DataTable tblSiteMap = GetSiteMapFromDB();
                   _rootNode = GetRootNode(tblSiteMap);                    
                   AddNode(_rootNode);
                   BuildSiteMapRecurse(tblSiteMap, _rootNode);
                   SqlCacheDependency sqlDepend = new SqlCacheDependency("SiteMapDB", "SiteMap");
                   context.Cache.Insert("RootNode", _rootNode, sqlDepend);
               }
               return _rootNode;
           }
       }
       private DataTable GetSiteMapFromDB()
       {
           string selectCommand = "SELECT Id,ParentId,Url,Title,Description FROM SiteMap";
           SqlDataAdapter dad = new SqlDataAdapter(selectCommand, _connectionString);
           DataTable tblSiteMap = new DataTable();
           dad.Fill(tblSiteMap);
           return tblSiteMap;
       }
       private SiteMapNode GetRootNode(DataTable siteMapTable)
       {
           DataRow[] results = siteMapTable.Select("ParentId IS NULL");
           if (results.Length == 0)
               throw new Exception("No root node in database");
           DataRow rootRow = results[0];
           return new SiteMapNode(this, rootRow["Id"].ToString(), rootRow["url"].ToString(), rootRow["title"].ToString(), rootRow["description"].ToString());
       }
       private void BuildSiteMapRecurse(DataTable siteMapTable, SiteMapNode parentNode)
       {
           DataRow[] results = siteMapTable.Select("ParentId=" + parentNode.Key);
           foreach (DataRow row in results)
           {
               SiteMapNode node = new SiteMapNode(this, row["Id"].ToString(), row["url"].ToString(), row["title"].ToString(), row["description"].ToString());
               AddNode(node, parentNode);
               BuildSiteMapRecurse(siteMapTable, node);
           }
       }
   }

}

File: Web.Config <configuration>

 <connectionStrings>
   <add
     name="conSiteMap"
     connectionString="Data Source=.\SQLExpress;Integrated

Security=True;AttachDbFileName=|DataDirectory|SiteMapDB.mdf;User Instance=True"/> </connectionStrings>

 <system.web>
   <siteMap defaultProvider="myProvider">
     <providers>
       <add
         name="myProvider"
         type="MyNamespace.SqlSiteMapProvider"
         connectionStringName="conSiteMap" />
     </providers>
   </siteMap>
     <caching>
     <sqlCacheDependency enabled = "true" pollTime = "5000" >
       <databases>
         <add name="SiteMapDB"
              connectionStringName="conSiteMap"
         />
       </databases>
     </sqlCacheDependency>
     </caching>
     </system.web>

</configuration></source>


Format SiteMapPath

   <source lang="csharp">

<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <style type="text/css">
       .siteMapPath
       {
           font:20px Comic Sans MS,Serif;
       }
       .currentNodeStyle
       {
           font-weight:bold;
       }
       .nodeStyle
       {
           text-decoration:none;
       }
       .pathSeparatorStyle
       {
           background-color:yellow;
           margin:10px;
           border:Solid 1px black;
       }
       .rootNodeStyle
       {
           text-decoration:none;
       }
   </style>
   <title>SiteMapPath Style</title>

</head> <body>

   <form id="form1" runat="server">
   <asp:SiteMapPath
       id="SiteMapPath1"
       CssClass="siteMapPath"
       CurrentNodeStyle-CssClass="currentNodeStyle"
       NodeStyle-CssClass="nodeStyle"
       PathSeparatorStyle-CssClass="pathSeparatorStyle"
       RootNodeStyle-CssClass="rootNodeStyle"
       Runat="server" />

SiteMapPath Style

   </form>

</body> </html> File: Web.sitemap

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" > <siteMapNode

 url="Default.aspx"
 title="Home"
 description="The Home Page">
 <siteMapNode
   url="Default1.aspx"
   title="Our Products"
   description="Products that we offer">
   <siteMapNode
     url="FirstProduct.aspx"
     title="First Product"
     description="The description of the First Product" />
   <siteMapNode
     url="SecondProduct.aspx"
     title="Second Product"
     description="The description of the Second Product" />
 </siteMapNode>
 <siteMapNode
   url="Default2.aspx"
   title="Our Services"
   description="Services that we offer">
   <siteMapNode
     url="FirstService.aspx"
     title="First Service"
     description="The description of the First Service"
     metaDescription="The first service" />
   <siteMapNode
     url="SecondService.aspx"
     title="Second Service"
     description="The description of the Second Service" />
 </siteMapNode>

</siteMapNode> </siteMap></source>


Merging Multiple Site Maps

   <source lang="csharp">

File: Web.sitemap Code View: Scroll / Show All <siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" > <siteMapNode

 url="Default.aspx"
 title="Home"
 description="The Home Page">
 <siteMapNode
   siteMapFile="Employees/Employees.sitemap" />

</siteMapNode> </siteMap>

File: Employees/Employees.sitemap <siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" >

 <siteMapNode
   url="Employees/Default.aspx"
   title="Employees"
   description="Contains descriptions of employees">
   <siteMapNode
     url="Employees/BillGates.aspx"
     title="Bill Gates"
     description="Bill Gates Page" />
   <siteMapNode
     url="Employees/SteveJobs.aspx"
     title="Steve Jobs"
     description="Steve Jobs Page" />
 </siteMapNode>

</siteMap></source>


Removing the root node from the retrieved node collection

   <source lang="csharp">

<%@ Page Language="VB" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <title>Menu Server Control</title>

</head> <body>

   <form id="form1" runat="server">
       <asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server"
        ShowStartingNode="False" />
       <asp:Menu ID="Menu1" Runat="server" DataSourceID="SiteMapDataSource1">
       </asp:Menu>
   </form>

</body> </html> File: Web.sitemap <?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" >

  <siteMapNode title="Home" description="Home Page" url="Default.aspx">
     <siteMapNode title="News" description="The Latest News" url="News.aspx">
        <siteMapNode title="U.S." description="U.S. News" url="News.aspx?cat=us" />
        <siteMapNode title="World" description="World News" url="News.aspx?cat=world" />
        <siteMapNode title="Technology" description="Technology News" url="News.aspx?cat=tech" />
        <siteMapNode title="Sports" description="Sports News" url="News.aspx?cat=sport" />
     </siteMapNode>
     <siteMapNode title="Weather" description="The Latest Weather" url="Weather.aspx" />
  </siteMapNode>

</siteMap></source>


The SiteMapPath control enables you to navigate to any parent page of the current page.

   <source lang="csharp">

You can use the SiteMapPath control by declaring the control in a page. The control automatically uses the Web.sitemap file located in the root of your application. Typically, you add a SiteMapPath control to a Master Page.

<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <title>Display SiteMapPath</title>

</head> <body>

   <form id="form1" runat="server">
   <asp:SiteMapPath
       id="SiteMapPath1"
       Runat="server" />

Displaying a SiteMapPath Control

   </form>

</body> </html>

File: Web.sitemap

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" > <siteMapNode

 url="Default.aspx"
 title="Home"
 description="The Home Page">
 <siteMapNode
   url="Default1.aspx"
   title="Our Products"
   description="Products that we offer">
   <siteMapNode
     url="FirstProduct.aspx"
     title="First Product"
     description="The description of the First Product" />
   <siteMapNode
     url="SecondProduct.aspx"
     title="Second Product"
     description="The description of the Second Product" />
 </siteMapNode>
 <siteMapNode
   url="Default2.aspx"
   title="Our Services"
   description="Services that we offer">
   <siteMapNode
     url="FirstService.aspx"
     title="First Service"
     description="The description of the First Service"
     metaDescription="The first service" />
   <siteMapNode
     url="SecondService.aspx"
     title="Second Service"
     description="The description of the Second Service" />
 </siteMapNode>

</siteMapNode> </siteMap></source>


To display different links to different users depending on their roles, enable the Security Trimming

   <source lang="csharp">

File: Web.Config <configuration>

 <system.web>
   <authentication mode="Windows" />
   <roleManager enabled="true" />
   <siteMap defaultProvider="MySiteMapProvider">
     <providers>
       <add
         name="MySiteMapProvider"
         type="System.Web.XmlSiteMapProvider"
         securityTrimmingEnabled="true"
         siteMapFile="Web.sitemap" />
     </providers>
   </siteMap>
 </system.web>

</configuration></source>


Using a template with the SiteMapPath control.

   <source lang="csharp">

<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <title>SiteMapPath Templates</title>

</head> <body>

   <form id="form1" runat="server">
   <asp:SiteMapPath
       id="SiteMapPath1"
       Runat="server">
       <NodeTemplate>
       <asp:HyperLink
           id="lnkPage"
           Text="<%# Eval("Title") %>"
           NavigateUrl="<%# Eval("Url") %>"
           ToolTip="<%# Eval("Description") %>"
           Runat="server" />
       [<%# Eval("ChildNodes.Count") %>]
       </NodeTemplate>
   </asp:SiteMapPath>

SiteMapPath Templates

   </form>

</body> </html> File: Web.sitemap

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" > <siteMapNode

 url="Default.aspx"
 title="Home"
 description="The Home Page">
 <siteMapNode
   url="Default1.aspx"
   title="Our Products"
   description="Products that we offer">
   <siteMapNode
     url="FirstProduct.aspx"
     title="First Product"
     description="The description of the First Product" />
   <siteMapNode
     url="SecondProduct.aspx"
     title="Second Product"
     description="The description of the Second Product" />
 </siteMapNode>
 <siteMapNode
   url="Default2.aspx"
   title="Our Services"
   description="Services that we offer">
   <siteMapNode
     url="FirstService.aspx"
     title="First Service"
     description="The description of the First Service"
     metaDescription="The first service" />
   <siteMapNode
     url="SecondService.aspx"
     title="Second Service"
     description="The description of the Second Service" />
 </siteMapNode>

</siteMapNode> </siteMap></source>


Using the SiteMap Class

   <source lang="csharp">

Under the covers, the SiteMapDataSource control represents the contents of the SiteMap class.

File: Global.asax <%@ Application Language="C#" %> <%@ Import Namespace="System.IO" %> <script runat="server">

   void Application_Start(Object sender, EventArgs e)
   {
        SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(SiteMap_SiteMapResolve);
   }
   SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
   {
       if (SiteMap.CurrentNode == null)
       {
           string url = e.Context.Request.Path;
           string title = Path.GetFileNameWithoutExtension(url);
           SiteMapNode newNode = new SiteMapNode(e.Provider, url, url, title);
           newNode.ParentNode = SiteMap.RootNode;
           return newNode;
       }
       return SiteMap.CurrentNode;
   }

</script> File: Web.sitemap

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" > <siteMapNode

 url="Default.aspx"
 title="Home"
 description="The Home Page">
 <siteMapNode
   url="Default1.aspx"
   title="Our Products"
   description="Products that we offer">
   <siteMapNode
     url="FirstProduct.aspx"
     title="First Product"
     description="The description of the First Product" />
   <siteMapNode
     url="SecondProduct.aspx"
     title="Second Product"
     description="The description of the Second Product" />
 </siteMapNode>
 <siteMapNode
   url="Default2.aspx"
   title="Our Services"
   description="Services that we offer">
   <siteMapNode
     url="FirstService.aspx"
     title="First Service"
     description="The description of the First Service"
     metaDescription="The first service" />
   <siteMapNode
     url="SecondService.aspx"
     title="Second Service"
     description="The description of the Second Service" />
 </siteMapNode>

</siteMapNode> </siteMap></source>


Using the SiteMapNode Class

   <source lang="csharp">

<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <script runat="server">

   void Page_Load()
   {
       if (!Page.IsPostBack)
       {
           SiteMapNode currentNode = SiteMap.CurrentNode;
           this.Title = currentNode.Title;
           ltlBodyTitle.Text = currentNode.Title;
           lblDescription.Text = currentNode.Description;
       }
   }

</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <title>First Product</title>

</head> <body>

   <form id="form1" runat="server">

<asp:Literal ID="ltlBodyTitle" runat="server" />

   <asp:Label
       id="lblDescription"
       Runat="server" />
   </form>

</body> </html>

File: Web.sitemap

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" > <siteMapNode

 url="Default.aspx"
 title="Home"
 description="The Home Page">
 <siteMapNode
   url="Default1.aspx"
   title="Our Products"
   description="Products that we offer">
   <siteMapNode
     url="FirstProduct.aspx"
     title="First Product"
     description="The description of the First Product" />
   <siteMapNode
     url="SecondProduct.aspx"
     title="Second Product"
     description="The description of the Second Product" />
 </siteMapNode>
 <siteMapNode
   url="Default2.aspx"
   title="Our Services"
   description="Services that we offer">
   <siteMapNode
     url="FirstService.aspx"
     title="First Service"
     description="The description of the First Service"
     metaDescription="The first service" />
   <siteMapNode
     url="SecondService.aspx"
     title="Second Service"
     description="The description of the Second Service" />
 </siteMapNode>

</siteMapNode> </siteMap></source>


using the StartFromCurrentNode property

   <source lang="csharp">

<%@ Page Language="VB" %>

<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">

   <title>Menu Server Control</title>

</head> <body>

   <form id="form1" runat="server">
       <asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server"
        StartFromCurrentNode="True" />
       <asp:Menu ID="Menu1" Runat="server" DataSourceID="SiteMapDataSource1">
       </asp:Menu>
   </form>

</body> </html>

File: Web.sitemap <?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" >

  <siteMapNode title="Home" description="Home Page" url="Default.aspx">
     <siteMapNode title="News" description="The Latest News" url="News.aspx">
        <siteMapNode title="U.S." description="U.S. News" url="News.aspx?cat=us" />
        <siteMapNode title="World" description="World News" url="News.aspx?cat=world" />
        <siteMapNode title="Technology" description="Technology News" url="News.aspx?cat=tech" />
        <siteMapNode title="Sports" description="Sports News" url="News.aspx?cat=sport" />
     </siteMapNode>
     <siteMapNode title="Weather" description="The Latest Weather" url="Weather.aspx" />
  </siteMapNode>

</siteMap></source>


Using the StartingNodeUrl property

   <source lang="csharp">

<%@ Page Language="VB" %>

<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">

   <title>Menu Server Control</title>

</head> <body>

   <form id="form1" runat="server">
       <asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server"
        StartingNodeUrl="Finance.aspx" />
       <asp:Menu ID="Menu1" Runat="server" DataSourceID="SiteMapDataSource1">
       </asp:Menu>
   </form>

</body> </html>

File: Web.sitemap <?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" >

  <siteMapNode title="Home" description="Home Page" url="Default.aspx">
     <siteMapNode title="News" description="The Latest News" url="News.aspx">
        <siteMapNode title="U.S." description="U.S. News" url="News.aspx?cat=us" />
        <siteMapNode title="World" description="World News" url="News.aspx?cat=world" />
        <siteMapNode title="Technology" description="Technology News" url="News.aspx?cat=tech" />
        <siteMapNode title="Sports" description="Sports News" url="News.aspx?cat=sport" />
     </siteMapNode>
     <siteMapNode title="Weather" description="The Latest Weather" url="Weather.aspx" />
  </siteMapNode>

</siteMap></source>


Working with the CurrentNode object (C#)

   <source lang="csharp">

<%@ Page Language="C#" %> <script runat="server">

   protected void Page_Load(object sender, System.EventArgs e)
   {
       Label1.Text = SiteMap.CurrentNode.Description + "
" + SiteMap.CurrentNode.HasChildNodes + "
" + SiteMap.CurrentNode.NextSibling.ToString() + "
" + SiteMap.CurrentNode.ParentNode.ToString() + "
" + SiteMap.CurrentNode.PreviousSibling.ToString() + "
" + SiteMap.CurrentNode.RootNode.ToString() + "
" + SiteMap.CurrentNode.Title + "
" + SiteMap.CurrentNode.Url; }

</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">

   <title>SiteMapDataSource</title>

</head> <body>

   <form id="form1" runat="server">
       <asp:Label ID="Label1" Runat="server"></asp:Label>
   </form>

</body>

File: Web.sitemap <?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" >

  <siteMapNode title="Home" description="Home Page" url="Default.aspx">
     <siteMapNode title="News" description="The Latest News" url="News.aspx">
        <siteMapNode title="U.S." description="U.S. News" url="News.aspx?cat=us" />
        <siteMapNode title="World" description="World News" url="News.aspx?cat=world" />
        <siteMapNode title="Technology" description="Technology News" url="News.aspx?cat=tech" />
        <siteMapNode title="Sports" description="Sports News" url="News.aspx?cat=sport" />
     </siteMapNode>
     <siteMapNode title="Weather" description="The Latest Weather" url="Weather.aspx" />
  </siteMapNode>

</siteMap></source>


Working with the CurrentNode object (VB)

   <source lang="csharp">

<%@ Page Language="VB" %> <script runat="server" language="vb">

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
       Label1.Text = SiteMap.CurrentNode.Description & "
" & _ SiteMap.CurrentNode.HasChildNodes & "
" & _ SiteMap.CurrentNode.NextSibling.ToString() & "
" & _ SiteMap.CurrentNode.ParentNode.ToString() & "
" & _ SiteMap.CurrentNode.PreviousSibling.ToString() & "
" & _ SiteMap.CurrentNode.RootNode.ToString() & "
" & _ SiteMap.CurrentNode.Title & "
" & _ SiteMap.CurrentNode.Url End Sub

</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">

   <title>SiteMapDataSource</title>

</head> <body>

   <form id="form1" runat="server">
       <asp:Label ID="Label1" Runat="server"></asp:Label>
   </form>

</body> File: Web.sitemap <?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.ru/AspNet/SiteMap-File-1.0" >

  <siteMapNode title="Home" description="Home Page" url="Default.aspx">
     <siteMapNode title="News" description="The Latest News" url="News.aspx">
        <siteMapNode title="U.S." description="U.S. News" url="News.aspx?cat=us" />
        <siteMapNode title="World" description="World News" url="News.aspx?cat=world" />
        <siteMapNode title="Technology" description="Technology News" url="News.aspx?cat=tech" />
        <siteMapNode title="Sports" description="Sports News" url="News.aspx?cat=sport" />
     </siteMapNode>
     <siteMapNode title="Weather" description="The Latest Weather" url="Weather.aspx" />
  </siteMapNode>

</siteMap></source>