因为需要从SQL里拉数据过来,所以这里分为两个类,一个用来取数据,一个是provider
先介绍provider
using
System;
using
System.Data;
using
System.Data.SqlClient;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
Microsoft.Practices.EnterpriseLibrary.Common;
using
Microsoft.Practices.EnterpriseLibrary.Data;
using
System.Security.Permissions;
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/// <summary>
/// 以SQL数据源作为参数的provider
/// </summary>
[AspNetHostingPermission(SecurityAction.Demand, Level
=
AspNetHostingPermissionLevel.Minimal)]
public
class
SiteMapProvider : StaticSiteMapProvider
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
//根节点
private SiteMapNode _rootNode=null;
//初始化状态
private bool initialized = false;
//默认构造函数
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public SiteMapProvider() ...{ }
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
重载方法#region 重载方法
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 返回当前网站地图的根节点
/// </summary>
public override SiteMapNode RootNode
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
get
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
SiteMapNode temp = null;
temp = BuildSiteMap();
return temp;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 返回当前提供程序目前管理的所有节点的根节点
/// </summary>
/// <returns>根节点</returns>
protected override SiteMapNode GetRootNodeCore()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return RootNode;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 初始化
/// </summary>
/// <param name="name"></param>
/// <param name="attributes"></param>
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection attributes)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (IsInitialized)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return;
}
base.Initialize(name, attributes);
initialized = true;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 清空所有导航节点
/// </summary>
protected override void Clear()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
lock (this)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_rootNode = null;
base.Clear();
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 创建sitemap树
/// </summary>
/// <returns>SiteMap的根节点</returns>
public override SiteMapNode BuildSiteMap()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
lock (this)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (!IsInitialized)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
throw new Exception("BuildSiteMap called incorrectly");
}
if (null == _rootNode)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Clear();
SiteMapProviderMetaData metaData = new SiteMapProviderMetaData();
AddRoot(metaData);
}
return _rootNode;
}
}
#endregion
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
自定义属性#region 自定义属性
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 是否已经初始化
/// </summary>
public virtual bool IsInitialized
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
get
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return initialized;
}
}
#endregion
public void AddChild(SiteMapNode CurrentNode, SiteMapProviderMetaData MetaData)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
DataView child = MetaData.GetChild(CurrentNode);
foreach (DataRowView row in child)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
SiteMapNode temp = new SiteMapNode(this, row[0].ToString(), row[2].ToString(), row[1].ToString());
AddNode(temp, CurrentNode);
AddChild(temp, MetaData);
}
}
public void AddRoot(SiteMapProviderMetaData MetaData)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
DataView root = MetaData.GetRoot();
foreach (DataRowView row in root)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_rootNode = new SiteMapNode(this, row[0].ToString(), row[2].ToString(), row[1].ToString());
AddNode(_rootNode, null);
AddChild(_rootNode, MetaData);
}
}
然后是MetaData类
using
System;
using
System.Data;
using
System.Data.SqlClient;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
Microsoft.Practices.EnterpriseLibrary.Common;
using
Microsoft.Practices.EnterpriseLibrary.Data;
using
System.Security.Permissions;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/// <summary>
/// Summary description for SiteMapProviderMetaData
/// </summary>
public
class
SiteMapProviderMetaData
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
private Database _db;//数据库操作句柄
private DataTable _source;//保存SiteMap元数据的表
public SiteMapProviderMetaData()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_db = DatabaseFactory.CreateDatabase("Test");//建立连接
GetSiteMapMetaData();
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 获得SiteMap的数据源,并给_Source赋值
/// </summary>
/// <returns>元数据</returns>
private DataTable GetSiteMapMetaData()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
DataSet dst = null;
dst = _db.ExecuteDataSet(CommandType.Text, "select id,title,url,parentId from navigation");
if (dst != null)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this._source = dst.Tables[0];
}
return this._source;
}
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
GetChild方法#region GetChild方法
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 获得当前节点的子节点
/// </summary>
/// <param name="Source">数据源</param>
/// <param name="CurrentId">当前节点</param>
/// <returns>子节点的元数据</returns>
public DataView GetChild(SiteMapNode CurrentNode)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return this.GetChild(this._source, CurrentNode);
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 获得当前节点的子节点
/// </summary>
/// <param name="Source">数据源</param>
/// <param name="CurrentId">当前节点</param>
/// <returns>子节点的元数据</returns>
public DataView GetChild(DataTable Source, SiteMapNode CurrentNode)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
DataView dvw = new DataView(Source);
dvw.RowFilter = "parentId=" + CurrentNode.Key.ToString();
return dvw;
}
#endregion
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
GetRoot方法#region GetRoot方法
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 获得根节点元数据
/// </summary>
/// <param name="Source">数据源</param>
/// <returns>根节点的元数据</returns>
public DataView GetRoot(DataTable Source)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
DataView dvw = new DataView(Source);
dvw.RowFilter = "parentId is null";
return dvw;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 获得根节点元数据
/// </summary>
/// <returns>根节点的元数据</returns>
public DataView GetRoot()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return this.GetRoot(this._source);
}
#endregion
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
}