分享

自定义SiteMapProvider实现从SQL Server中读取站点地图数据结构收藏【转载】

 glxym 2014-04-10
 

自定义SiteMapProvider实现从SQL Server中读取站点地图数据结构收藏【转载】

分类: [随笔分类]Microsoft .NET 398人阅读 评论(0) 收藏 举报
该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说明! 

陈希章

原文地址:http://www.cnblogs.com/chenxizhang/archive/2009/03/06/1404773.html
原文标题:自定义SiteMapProvider实现从SQL Server中读取站点地图数据结构收藏【转载】
原文发表:2009/3/6 8:46:00

转载自: http://blog.csdn.net/zwyl2001/archive/2007/07/29/1715267.aspx

 

关键的几个地方

1. 数据库结构

NodeId                             varchar(10)
NodeName                     varchar(20)
NodeIcon                         varchar(20)
NodeUrl                           varchar(50)
NodeDescrition              varchar(256)
ParentNodeId                 varchar(10)

2. 创建自定义Provider

public class SqlSiteMapProvider:StaticSiteMapProvider
    {
        Microsoft.Practices.EnterpriseLibrary.Data.Database _Database;
        private bool _Initialized = false;
        ///


        /// 站点地图根节点
        ///

        private SiteMapNode _RootNode = null;
        ///
        /// 清除站点地图中的节点。
        ///

        protected override void Clear()
        {
            lock (this)
            {
                _RootNode = null;
                base.Clear();
            }
        }
        ///
        /// 从数据库中检索站点数据并构建站点地图
        ///

        /// 
        public override SiteMapNode BuildSiteMap()
        {
            //因为SiteMap类是静态的,所以应确保站点地图被构建完成之前,他不要被修改。
            lock (this)
            {
                //如果提供程序没有被初始化,抛出异常。
                if (!IsInitialized)
                {
                    throw new ProviderException("BuildSiteMap called incorrectly.");
                }

                if (_RootNode == null)
                {
                    //清空节点
                    Clear();
                    // 构造根节点
                    string rootNodeId = "";
                    //TODO:具体程序中修改之
                    DbDataReader rootNodeReader = _Database.ExecuteReader(CommandType.Text, "SELECT nodeid, nodeurl, nodename,nodeicon FROM SiteMap WHERE ParentNodeId  IS NULL") as DbDataReader;
                    try
                    {
                        if (rootNodeReader.HasRows)
                        {
                            rootNodeReader.Read();
                            rootNodeId = rootNodeReader.GetString(0);
                            // 为当前的 StaticSiteMapProvider创建一个 SiteMapNode 根节点 .
                            _RootNode = new SiteMapNode(this,
                                                         rootNodeId,
                                                         rootNodeReader.GetString(1),
                                                         rootNodeReader.GetString(2));

                        }
                        else
                        {
                            return null;
                        }
                    }
                    finally
                    {
                        rootNodeReader.Close();
                    }
                    // 构造子节点
                    //TODO:具体程序中修改之
                    System.Data.Common.DbCommand command = _Database.GetSqlStringCommand("SELECT nodeid, nodeurl, nodename,nodeicon FROM SiteMap WHERE ParentNodeId  = @nodeid");
                    _Database.AddInParameter(command,"@nodeid", DbType.String,rootNodeId);

                    DbDataReader childNodesReader = _Database.ExecuteReader(command) as DbDataReader;
                    try
                    {
                        if (childNodesReader.HasRows)
                        {
                            SiteMapNode childNode = null;
                            while (childNodesReader.Read())
                            {
                                childNode = new SiteMapNode(this,
                                                             childNodesReader.GetString(0),
                                                             childNodesReader.GetString(1),
                                                             childNodesReader.GetString(2));

                                //将图标信息添加到节点的自定义属性中。
                                childNode["Icon"] = childNodesReader.GetString(3);

                                //向根节点中添加子节点。
                                AddNode(childNode, _RootNode);
                            }
                        }

                    }
                    finally
                    {
                        childNodesReader.Close();
                    }
                }
                //返回构建后的根节点。
                return _RootNode;
            }

        }
        ///


        /// 获得已经构建完成的根节点。
        ///

        /// SiteMap根节点
        protected override SiteMapNode GetRootNodeCore()
        {
            return RootNode;
        }
        ///
        /// 获取当前提供程序是否已经被初始化。
        ///

        public virtual bool IsInitialized
        {
            get
            {
                return _Initialized;
            }
        }
        ///
        /// 获取SiteMap根节点
        ///

        public override SiteMapNode RootNode
        {
            get
            {
                SiteMapNode temp = null;
                temp = BuildSiteMap();
                return temp;
            }
        }
        ///
        /// 初始化提供程序。
        ///

        /// 提供程序的名称
        /// 配置参数
        public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
        {
            if (config == null)
            {
                throw new ArgumentNullException("config");
            }
            if (string.IsNullOrEmpty(name))
            {
                name = "AspNetSqlSiteMapProvider";
            }
            if (string.IsNullOrEmpty(config["description"]))
            {
                config.Remove("description");
                config.Add("description", "SiteMapSqlProvider_description");
            }
            base.Initialize(name, config);
            string specifiedConnectionString = config["connectionStringName"];
            if ((specifiedConnectionString == null) || (specifiedConnectionString.Length < 1))
            {
                throw new ProviderException("Connection_name_not_specified");
            }
            _Database = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(specifiedConnectionString);
            _Initialized = true;
        }
    }

 

3. 配置文件修改


      
                     type="SqlSiteMapProvider"
             connectionStringName="LocalServer"/>
      

   

 

 

4. 还可以把动态部分嵌入到固定的Web.Sitemap文件中








 

5. 站点地图项目可以跟角色进行绑定。

通过siteMapNode元素的Roles属性指定

作者:陈希章
出处:http://blog.csdn.net/chen_xizhang
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多