ASP.NET Tutorial/Development/Site Maps
Содержание
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>
<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>
<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>
<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>