ASP.NET中如何利用数据库存储网站地图

如何利用数据库存储网站地图,并用TreeView和Menu控件实现导航。... 如何利用数据库存储网站地图,并用TreeView和Menu控件实现导航。 展开
 我来答
逸闻轩科技
2010-05-24 · 超过12用户采纳过TA的回答
知道答主
回答量:46
采纳率:0%
帮助的人:32.6万
展开全部

为导航控件创建自定义的数据提供程序

导航控件使用的是Provider模型实现对导航数据的显示,它默认提供了对XML格式数据访问的的XmlSiteMapProvider,用户也可以定义自己的Provider向导航控件提供数据。

虽然默认的XmlSiteMapProvider能够把XML文件中的数据显示在页面上,但有的时候我们更需要把数据从数据库中加载到导航控件中显示出来。这其实不难,只要我们编写自己的SqlSiteMapProvider就可以了。

要编写自定义的Provider程序只需要派生StaticSiteMapProvider类,并重写该类中有两个方法

GetRootNodeCall():返回站点地图的根节点

BuildSiteMap():构建站点地图并返回根节点

除了这两个方法外,我们还常用到的就是Initialize()方法。当我们在Web.Config中注册我们自定义的Provider时,当程序运行时就会触发该Provider的Initialize()方法,初始化该Provider,并把Web.Config中配置的names和values等内容传入Initialize(),在Initialize()方法中把传入的内容保存到类的成员变量中去,以便其它方法的使用。

下面我们编写一个SqlTreeProvider,从数据库中读取行政区的数据,向导航控件提供数据。

数据库结构如下:

下面是我们编写的SqlTreeProvider代码

public class SqlTreeProvider : StaticSiteMapProvider

{

//连接字符串,从web.config中取得连接字符串的值,以知道该从哪个数据库中读取数据

    protected string _ConnectionString;

//根节点对象

    protected SiteMapNode _Root;

public SqlTreeProvider()

{

}

//从web.config中读取内容,初始化成员变量。

    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection attributes)

    {

        base.Initialize(name, attributes);

        _ConnectionString = attributes["connectionString"].ToString();

    }

//用于递归读取行政区的方法

    private void CreateNode(SiteMapNode parentNode)

    {

        if (parentNode == null)

            return;

        List<NodeData> list = new NodeDA(_ConnectionString).Select(parentNode.Key);

        foreach (NodeData data in list)

        {

            SiteMapNode node = new SiteMapNode(this, data.Code, "", data.Name);

            this.AddNode(node,parentNode);

            CreateNode(node);

        }

    }

//构建站点地图对象

    public override SiteMapNode BuildSiteMap()

    {

        if (_Root == null)

        {

            _Root = new SiteMapNode(this, "0001", "", "中国");

            AddNode(_Root);

            CreateNode(_Root);

        }

         return _Root;

    }

//返回根节点对象

    protected override SiteMapNode GetRootNodeCore()

    {

        return _Root;

    }

//内部类,实体类

    class NodeData

    {

        public string Code { get; set; }

        public string Name { get; set; }

        public string ParentCode { get; set; }

    }

//内部类,数据访问类

    class NodeDA

    {

        private SqlConnection _Conn;

        private SqlCommand _Cmd;

        public NodeDA(string connectionString)

        {

            string cs = System.Configuration.ConfigurationManager.ConnectionStrings[connectionString].ConnectionString;

            _Conn = new SqlConnection(cs);

            _Cmd = _Conn.CreateCommand();

        }

        public List<NodeData> Select(string parentCode)

        {

            List<NodeData> list = new List<NodeData>();

            _Cmd.CommandText = "select * from chinastates where parentareacode = @parentareacode";

            _Cmd.Parameters.Clear();

            _Cmd.Parameters.AddWithValue("@parentareacode",parentCode);

            try

            {

                _Conn.Open();

                SqlDataReader dr = _Cmd.ExecuteReader();

                while (dr.Read())

                {

                    NodeData data = new NodeData

                    {

                        Code = dr["areacode"].ToString(),

                        Name = dr["areaname"].ToString(),

                        ParentCode = dr["parentareacode"].ToString()

                    };

                    list.Add(data);

                }

            }

            finally

            {

                _Conn.Close();

            }

            return list;

        }

    }

}

上面我们编写完成SqlTreeProvider,如果让系统能够识别它,并利用它加载数的话,还应录在web.config中注册它。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式