1:web.sitemap
2:SiteMapPath 控件
3:筛选 SiteMapDataSource Web 服务器控件检索到的节点
4:以编程方式枚举站点地图节点
5、以编程方式修改内存中的站点地图节点
6:配置多个站点地图和站点地图提供程序
7:创建自己的站点地图提供程序
8:根据安全角色筛选站点地图节点
可以使用web.sitemap来设置静态导航数据,如下:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode title="Home" >
<siteMapNode title="Services" >
<siteMapNode title="Training" url="~/Sitemap/Training.aspx"/>
</siteMapNode>
<siteMapNode title="Services2" >
<siteMapNode title="Training2" url="~/Sitemap/Training2.aspx"/>
</siteMapNode>
</siteMapNode>
</siteMap>
可以使用SiteMapPath 控件来:自定义链接样式属性、自定义显示在链接之间的字符、指定显示在链接之间的图像、反转 SiteMapPath 控件所显示的路径的方向、限制显示的父链接的数量,如:
<asp:SiteMapPath ID="SiteMapPath1" runat="server" SkipLinkText="Skip Menu" RootNodeStyle-Font-Names="Verdana"
RootNodeStyle-ForeColor="Orange" RootNodeStyle-BorderWidth="2" PathSeparator=" :: ">
<PathSeparatorTemplate>
<asp:Image ID="Image1" runat="Server" Width="20" ImageUrl="~/Images/arrowright32.png" />
</PathSeparatorTemplate>
</asp:SiteMapPath>
SiteMapDataSource 控件从站点地图提供程序(例如 XmlSiteMapProvider,它是 ASP.NET 的默认站点地图提供程序)检索站点地图数据。您可以将 SiteMapDataSource 控件配置为返回站点地图节点的全集或子集。如果需要在一页上显示多个导航结构并且每个导航结构显示单独的站点地图部分,这非常有用。如果需要将站点导航元素分布在站点中不同的母版页上并且每个母版页显示整个站点地图的不同部分,这也非常有用。
若要使用这些站点导航控件,您必须在 Web.sitemap 文件中描述站点的结构,并创建在站点地图中列出的 .aspx 文件。
StartingNodeUrl="~/Services.aspx" ,结构从第二个节点开始。
StartFromCurrentNode 属性设置为 true 可以从当前页面的节点开始检索站点地图结构。
StartingNodeOffset 属性设置为 2 可以检索站点地图结构,从根节点往下两个节点的深度开始,沿着到当前页的路径进行。
下面的代码示例演示如何显示当前页的所有子节点的标题(当前页需在站点地图文件中列出)。如果当前页没有在站点地图文件中列出,使用 SiteMap 对象的第一行代码将引发 NullReferenceException 异常。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Training2.aspx.cs" Inherits="WebApplication2.Training2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
try
{
string LabelText = "";
// Displays the title of the current node.
Label_CurrentNode.Text = SiteMap.CurrentNode.Title;
// Determines if the current node has child nodes.
if (SiteMap.CurrentNode.HasChildNodes)
{
foreach (SiteMapNode childNodesEnumerator in SiteMap.CurrentNode.ChildNodes)
{
// Displays the title of each node.
LabelText = LabelText + childNodesEnumerator.Title + "<br />";
}
}
Label_ChildNodes.Text = LabelText;
}
catch (System.NullReferenceException ex)
{
Label_CurrentNode.Text = "The current file is not in the site map.";
}
catch (Exception ex)
{
Label_CurrentNode.Text = "Generic exception: " + e.ToString();
}
}
</script>
<html>
<head>
<title>Enumerating Child Site Map Nodes</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<h2>
Current Node</h2>
<asp:Label ID="Label_CurrentNode" runat="Server"></asp:Label>
<h2>
Child Nodes</h2>
<asp:Label ID="Label_ChildNodes" runat="Server"></asp:Label>
<h2>
Verify Against Site Map</h2>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
<asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1">
</asp:TreeView>
</form>
</body>
</html>
网站经常使用动态 URL,其中包含作为查询字符串附加的信息。例如,新闻组或论坛的站点可能包含指向论坛或小组的静态 URL 以及每篇文章的动态 URL。一篇文章的 URL 可能为下面的格式:http://www.microsoft.com/newsgroups/ShowPost.aspx?ForumID=2&PostID=53
通过更新站点地图来列出每篇文章的 URL 并不是一种很有效的办法,原因是不能以编程方式将节点添加到站点地图中。但是,当用户查看文章时,可以使用 SiteMapPath 控件显示上溯至根节点的导航路径,并在该路径的各个链接中动态附加查询字符串,以标识文章、论坛或组。例如,到上述文章的导航路径可能如下所示:
主页 > 论坛列表 > 文章列表
站点地图"文章"节点的静态 Url 属性可能设置为 http://www.microsoft.com/newsgroups/ShowPost.aspx。但是在内存中,可以修改 SiteMapPath 控件中的 URL,以标识论坛和特定的文章。
可以使用 SiteMapResolve 事件在内存中更改站点地图节点,如下面的过程和示例所示。
前台:
<asp:SiteMapPath
id="SiteMapPath1"
runat="server"
RenderCurrentNodeAsLink="true" />
后台:
private void Page_Load(object sender, EventArgs e)
{
SiteMap.SiteMapResolve +=
new SiteMapResolveEventHandler(this.ExpandForumPaths);
}
private SiteMapNode ExpandForumPaths(Object sender, SiteMapResolveEventArgs e)
{
SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
SiteMapNode tempNode = currentNode;
int forumGroupID = GetMostRecentForumGroupID();
int forumID = GetMostRecentForumID(forumGroupID);
int postID = GetMostRecentPostID(forumID);
if (0 != postID)
{
tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
}
if ((null != (tempNode = tempNode.ParentNode)) &&
(0 != forumID))
{
tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
}
if ((null != (tempNode = tempNode.ParentNode)) &&
(0 != forumGroupID))
{
tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
}
return currentNode;
}
private int GetMostRecentForumGroupID()
{
return 24;
}
private int GetMostRecentForumID(int forumGroupId)
{
return 128;
}
private int GetMostRecentPostID(int forumId)
{
return 317424;
}
http://msdn.microsoft.com/zh-cn/library/ms178426(VS.90).aspx
如果要将站点地图信息存储在站点地图文件以外的位置,您可以创建自己的站点地图提供程序并对您的应用程序进行配置以调用自定义提供程序。站点地图提供程序在 Web.config 文件中配置。当应用程序运行时,ASP.NET 会调用您的提供程序,后者可以根据需要检索站点地图信息。然后,ASP.NET 根据您的提供程序返回的信息,相应地创建和填充 SiteMapNode 对象。通过使用 SiteMap 类,可以以编程方式访问这些对象。
创建自定义站点地图提供程序的三个主要理由如下:
为了将站点地图信息存储在 ASP.NET 默认站点地图提供程序不支持的数据源中。例如,您可能希望将站点地图数据存储在Oracle 数据库或其他数据源中。 为了使用与 Web.sitemap 文件所使用的架构不同的架构来管理导航信息。例如,您可能拥有一个用于存储站点地图数据的现有实现。 为了使用动态站点地图结构。例如,您可能希望每个客户端帐户能够查看不同的站点地图。示例:http://msdn.microsoft.com/zh-cn/library/ms178432(VS.90).aspx
PS:提到了用母版页来统一显示网站地图。
网站的一个常见要求是限制对某些页的访问。ASP.NET 角色管理和 ASP.NET URL 授权的组合提供了根据安全角色限制对 Web 文件的访问的方法。站点地图使用一种称为"安全修整"的功能隐藏指向那些受限制的文件的导航链接(也基于角色),从而实现这个目的。
角色是用户组的名称。在建立角色之后,可以将各个用户帐户分配到角色。可以根据角色限制对站点地图中的 Web 文件和节点的访问。
通过此演练,您将学会如何执行以下任务:
创建具有成员资格和用户登录功能的网站。 为网站建立角色并将用户帐户分配到建立的角色。 创建 URL 授权规则,这些规则有选择地授予或拒绝对页的访问。 创建站点地图并启用安全修整。 在网页上创建导航菜单。http://msdn.microsoft.com/zh-cn/library/ms178429(VS.90).aspx
转自:http://www.cnblogs.com/luminji/archive/2010/11/12/1875643.html