且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)

更新时间:2022-04-30 06:08:30

[索引页]
[源码下载]



温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)


作者:webabcd


介绍
ASP.NET 2.0 中的站点导航提供程序向应用程序中的页公开导航信息,使您可以独立于页的实际物理布局定义站点的结构。默认站点导航提供程序基于XML,但通过为站点地图编写自定义提供程序,也可以从任意后端公开此信息。


关键
1、创建.sitemap文件,其实就是一个xml文件,包括有着层次结构的<siteMapNode>元素

2、<siteMapNode>元素的属性:
  Url - 链接地址
  Title - 显示的标题
  Description - 描述(ToolTip)
  resourceKey - 本地化用的(要在<siteMap>节点加上这个属性enableLocalization=true)    
  securityTrimmingEnabled - 是否让sitemap支持安全特性
  roles - 哪些角色可以访问当前节点,多角色用逗号隔开(需要将securityTrimmingEnabled设置为true)
  siteMapFile - 引用另一个sitemap文件
  注:应用权限的时候,Web.config中的SiteMap节点的Provider也要有相对应的配置(securityTrimmingEnabled="true"

3、可以通过SiteMap和SiteMapNode类访问站点地图数据

4、自定义站点地图提供程序应该写一个继承自StaticSiteMapProvider的类

5、XmlSiteMapProvider要求站点地图节点具有唯一的URL


示例
SiteMap/Web.sitemap(包括一个有siteMapFile属性的节点)
<?xml version="1.0" encoding="utf-8" ?> 
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 
    <siteMapNode url="~/SiteMap/Test.aspx#1" title="首页"    description="首页描述"> 
        <siteMapNode url="~/SiteMap/Test.aspx#2" title="频道1"    description="频道1描述" /> 
        <siteMapNode url="~/SiteMap/Test.aspx#3" title="频道2" description="频道2描述" /> 
        <siteMapNode siteMapFile="WebChild.sitemap"> 
        </siteMapNode> 
        <siteMapNode url="~/SiteMap/Test.aspx#4" title="频道4" description="频道4描述" /> 
    </siteMapNode> 
</siteMap>
 
SiteMap/WebChild.sitemap(上面.sitemap文件某个节点的siteMapFile属性所指定的文件)
<?xml version="1.0" encoding="utf-8" ?> 
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 
    <siteMapNode url="~/SiteMap/Test.aspx#5" title="频道3"    description="频道3"> 
        <siteMapNode url="~/SiteMap/Test.aspx#6" title="栏目1"    description="栏目1描述" /> 
        <siteMapNode url="~/SiteMap/Test.aspx#7" title="栏目2"    description="栏目2描述" /> 
        <siteMapNode url="~/SiteMap/Test.aspx#8" title="栏目3"    description="栏目3描述" /> 
    </siteMapNode> 
</siteMap>
 
 
站点地图测试
SiteMap/Test.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Test.aspx.cs" 
        Inherits="SiteMap_Test" Title="站点地图测试" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <p> 
                <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1"> 
                </asp:TreeView> 
                <asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource2" Orientation="Horizontal"> 
                </asp:Menu> 
                <%--显示根节点的数据源--%> 
                <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" SiteMapProvider="XmlSiteMapProviderTest" /> 
                <%--不显示根节点的数据源--%> 
                <asp:SiteMapDataSource ID="SiteMapDataSource2" runat="server" SiteMapProvider="XmlSiteMapProviderTest" 
                        ShowStartingNode="false" /> 
        </p> 
        <p> 
                编码方式访问节点信息如下<br /> 
                <asp:Label ID="lbl" runat="server" BackColor="#DDDDDD" /> 
        </p> 
</asp:Content>
 
SiteMap/Test.aspx.cs
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Data; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Configuration; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Collections; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Web; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Web.Security; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Web.UI; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Web.UI.WebControls; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Web.UI.WebControls.WebParts; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Web.UI.HtmlControls; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)public partial class SiteMap_Test : System.Web.UI.Page 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        protected void Page_Load(object sender, EventArgs e) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 获取当前节点的Title 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                lbl.Text = "当前节点标题:" + SiteMap.CurrentNode.Title + "<br />"
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 取得url为“~/Default.aspx”的SiteMapNode 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                SiteMapNode smn = SiteMap.Provider.FindSiteMapNode("~/Default.aspx"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                lbl.Text += "Default.aspx节点的Url:" + smn.Url; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)}
 
站点地图测试(从数据库读数据)
SiteMap/FromDatabase.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="FromDatabase.aspx.cs" 
        Inherits="SiteMap_FromDatabase" Title="站点地图测试(从数据库读数据)" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1"> 
        </asp:TreeView> 
        <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" SiteMapProvider="SqlSiteMapProvider" /> 
</asp:Content>
 
自定义站点地图提供程序(SqlServer方式)
SqlSiteMapProvider.cs(“sp_GetSiteMap”为读取站点地图数据的存储过程,详见源码)
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Web; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Data.SqlClient; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Collections.Specialized; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Configuration; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Web.Configuration; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Collections.Generic; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Configuration.Provider; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Security.Permissions; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Data.Common; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)using System.Data; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
/// <summary> 
/// SqlSiteMapProvider 
/// </summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)public class SqlSiteMapProvider : StaticSiteMapProvider 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        private string _strCon; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        private int _indexID, _indexTitle, _indexUrl, _indexDesc, _indexParent; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        // 节点 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        private SiteMapNode _node; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)         
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        // 节点字典表 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        private Dictionary<int, SiteMapNode> _nodes = new Dictionary<int, SiteMapNode>(); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        // for 线程安全 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        private readonly object _lock = new object(); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// 初始化 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// </summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <param name="name">name</param> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <param name="config">config</param> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        public override void Initialize(string name, NameValueCollection config) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 验证是否有config 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                if (config == null
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        throw new ArgumentNullException("config不能是null"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 没有provider则设置为默认的 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                if (String.IsNullOrEmpty(name)) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        name = "SqlSiteMapProvider"
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 没有描述就增加一个描述 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                if (string.IsNullOrEmpty(config["description"])) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        config.Remove("description"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        config.Add("description""SqlSiteMapProvider"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 调用基类的初始化方法 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                base.Initialize(name, config); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 初始化连接字符串 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                string conStringName = config["connectionStringName"]; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                if (String.IsNullOrEmpty(conStringName)) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        throw new ProviderException("没找到connectionStringName"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                config.Remove("connectionStringName"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                if (WebConfigurationManager.ConnectionStrings[conStringName] == null
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        throw new ProviderException("根据connectionStringName没找到连接字符串"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 获得连接字符串 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                _strCon = WebConfigurationManager.ConnectionStrings[conStringName].ConnectionString; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                if (String.IsNullOrEmpty(_strCon)) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        throw new ProviderException("连接字符串是空的"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// 从持久性存储区加载站点地图信息,并在内存中构建它 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// </summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <returns></returns> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        public override SiteMapNode BuildSiteMap() 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                lock (_lock) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        // 线程安全的实现 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        if (_node != null
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                return _node; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        SqlConnection connection = new SqlConnection(_strCon); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        try 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                SqlCommand command = new SqlCommand("sp_GetSiteMap", connection); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                command.CommandType = CommandType.StoredProcedure; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                connection.Open(); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                SqlDataReader reader = command.ExecuteReader(); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                // 获得各个字段的索引 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                _indexID = reader.GetOrdinal("ID"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                _indexUrl = reader.GetOrdinal("Url"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                _indexTitle = reader.GetOrdinal("Title"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                _indexDesc = reader.GetOrdinal("Description"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                _indexParent = reader.GetOrdinal("Parent"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                if (reader.Read()) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                        // 把第一条记录作为根节点添加 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                        _node = CreateSiteMapNodeFromDataReader(reader); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                        AddNode(_node, null); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                        // 构造节点树 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                        while (reader.Read()) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                        { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                                // 在站点地图中增加一个节点 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                                SiteMapNode node = CreateSiteMapNodeFromDataReader(reader); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                                AddNode(node, GetParentNodeFromDataReader(reader)); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                        } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                reader.Close(); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        catch (Exception ex) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                throw new Exception(ex.ToString()); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        finally 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                                connection.Close(); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        // 返回SiteMapNode 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        return _node; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// 将检索目前由当前提供程序管理的所有节点的根节点 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// </summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <returns></returns> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        protected override SiteMapNode GetRootNodeCore() 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                lock (_lock) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        return BuildSiteMap(); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// 根据DataReader读出来的数据返回SiteMapNode 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// </summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <param name="reader">DbDataReader</param> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <returns></returns> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        private SiteMapNode CreateSiteMapNodeFromDataReader(DbDataReader reader) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                if (reader.IsDBNull(_indexID)) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        throw new ProviderException("没找到ID"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                int id = reader.GetInt32(_indexID); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                if (_nodes.ContainsKey(id)) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        throw new ProviderException("不能有重复ID"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 根据字段索引获得相应字段的值 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                string title = reader.IsDBNull(_indexTitle) ? null : reader.GetString(_indexTitle).Trim(); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                string url = reader.IsDBNull(_indexUrl) ? null : reader.GetString(_indexUrl).Trim(); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                string description = reader.IsDBNull(_indexDesc) ? null : reader.GetString(_indexDesc).Trim(); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 新建一个SiteMapNode 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                SiteMapNode node = new SiteMapNode(this, id.ToString(), url, title, description); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 把这个SiteMapNode添加进节点字典表里 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                _nodes.Add(id, node); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 返回这个SiteMapNode 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                return node; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// 得到父节点的SiteMapNode 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// </summary> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <param name="reader"></param> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        /// <returns></returns> 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        private SiteMapNode GetParentNodeFromDataReader(DbDataReader reader) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        { 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                if (reader.IsDBNull(_indexParent)) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        throw new ProviderException("父节点不能是空"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                int pid = reader.GetInt32(_indexParent); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                if (!_nodes.ContainsKey(pid)) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                        throw new ProviderException("有重复节点ID"); 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                // 返回父节点的SiteMapNode 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)                return _nodes[pid]; 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)        } 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图) 
温故知新ASP.NET 2.0(C#)(3) - SiteMap(站点地图)}
 
上面两个测试页面所需的web.config中的配置
<configuration> 
    <appSettings/> 
    <connectionStrings> 
        <add name="SqlConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True"/> 
    </connectionStrings> 
    <system.web> 
        <siteMap enabled="true" defaultProvider="XmlSiteMapProvider"> 
            <providers> 
                <add name="XmlSiteMapProvider" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="~/Web.sitemap"/> 
                <add name="XmlSiteMapProviderTest" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="~/Sitemap/Web.sitemap"/> 
                <add name="SqlSiteMapProvider" type="SqlSiteMapProvider" connectionStringName="SqlConnectionString" /> 
            </providers> 
        </siteMap> 
    </system.web> 
</configuration>
 
OK
[源码下载]
 






     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/344839,如需转载请自行联系原作者