ASP.NET中如何利用数据库存储网站地图
为导航控件创建自定义的数据提供程序
导航控件使用的是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中注册它。