using System;
using System.Data;
using System.Data.Common;
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.Data;
/// <summary>
/// Summary description for SqlSiteMapProvider2
/// </summary>
public class SqlSiteMapProvider2:SiteMapProvider
{
private string prefix = "";
private readonly object _lock = new object();
private string rdesp = string.Empty;
private string rurl = string.Empty;
private string rtitle = string.Empty;
private string trace = string.Empty;
private Database db = null;
private int RID = 0;
private int MID = 0;
public SqlSiteMapProvider2()
{
//
// TODO: Add constructor logic here
//
db = DatabaseFactory.CreateDatabase();
}
/// <summary>
/// 根据请求的ULR取得对应的结点信息
/// </summary>
/// <param name="rawUrl">请求的ULR,eg:http://www.studyez.com/Categorys.aspx?CategoryID=22401</param>
/// <returns>结点信息</returns>
public override SiteMapNode FindSiteMapNode(string rawUrl)
{
if (trace == "1")
{
LoggingRecord.WriteLogEntry("Access:", rawUrl, StudyEZ.WebServiceProxies.LoggingPriority.Trace, new StudyEZ.WebServiceProxies.LogginCategory[] { StudyEZ.WebServiceProxies.LogginCategory.Trace });
}
if (!string.IsNullOrEmpty(prefix))
{
rawUrl = rawUrl.ToLower().Replace(prefix.ToLower(), "~");
}
else
{
if (!rawUrl.StartsWith("/"))
rawUrl = "/" + rawUrl;
rawUrl = "~" + rawUrl;
}
if (rawUrl.ToLower() == this.rurl.ToLower())
return this.GetRootNodeCore();
SiteMapNode sn = null;
using (DbCommand cmd = db.GetStoredProcCommand("dir_GetSiteMapNode", new object[] { rawUrl }))
{
using (IDataReader dr = db.ExecuteReader(cmd))
{
int desp = dr.GetOrdinal("Description");
int idx = dr.GetOrdinal("ID");
int title = dr.GetOrdinal("Title");
int url = dr.GetOrdinal("URL");
int iroles = dr.GetOrdinal("Roles");
///
int tabType = dr.GetOrdinal("TabType");
int dirid = dr.GetOrdinal("DirID");
string Description = "";
int ID = 0;
string Title = "";
string URL = "";
string[] Roles = null;
int DirID = 0;
byte TabType = 0;
if (dr.Read())
{
Description = dr[desp].ToString();
ID = dr.IsDBNull(idx) ? 0 : dr.GetInt32(idx);
Title = dr[title].ToString();
if (Title.IndexOf("/") != -1)
Title.Replace("/", "_");
URL = dr[url].ToString();
DirID=dr.GetInt32(dirid );
TabType=dr.GetByte(tabType);
string roles = dr[iroles].ToString();
string[] rolelist = null;
rolelist = roles.Split(new char[] { ':' }, 512);
Roles = rolelist;
System.Collections.Specialized.NameValueCollection nav = new System.Collections.Specialized.NameValueCollection();
nav.Add("MapID", DirID.ToString());
sn = new SiteMapNode(this, ID.ToString(), URL, Title, Description, Roles,nav, null, null);
}
dr.Close();
}
}
if (sn == null)
sn = this.GetRootNodeCore();
return sn;
}
/// <summary>
/// 根据当前结点取对应的节点结点,基本上不用的。
/// </summary>
/// <param name="node">当前结点</param>
/// <returns>所有的子结点</returns>
public override SiteMapNodeCollection GetChildNodes(SiteMapNode node)
{
SiteMapNodeCollection smnc = new SiteMapNodeCollection();
try
{
using (DbCommand cmd = db.GetStoredProcCommand("dir_GetSiteMapChildNode", new object[] { node.Key }))
{
using (IDataReader dr = db.ExecuteReader(cmd))
{
int desp = dr.GetOrdinal("Description");
int idx = dr.GetOrdinal("ID");
int title = dr.GetOrdinal("Title");
int url = dr.GetOrdinal("URL");
int iroles = dr.GetOrdinal("Roles");
int tabType = dr.GetOrdinal("TabType");
int dirid = dr.GetOrdinal("DirID");
string Description = "";
int ID = 0;
string Title = "";
string URL = "";
string[] Roles = null;
int DirID = 0;
byte TabType = 0;
while (dr.Read())
{
Description = dr[desp].ToString();
ID = dr.IsDBNull(idx) ? 0 : dr.GetInt32(idx);
Title = dr[title].ToString();
if (Title.IndexOf("/") != -1)
Title.Replace("/", "_");
URL = dr[url].ToString();
string roles = dr[iroles].ToString();
DirID = dr.GetInt32(dirid);
TabType = dr.GetByte(tabType);
string[] rolelist = null;
rolelist = roles.Split(new char[] { ':' }, 512);
Roles = rolelist;
System.Collections.Specialized.NameValueCollection nav = new System.Collections.Specialized.NameValueCollection();
nav.Add("DirID", DirID.ToString());
nav.Add("TabType", TabType.ToString());
SiteMapNode sn = new SiteMapNode(this, ID.ToString(), URL, Title, Description, Roles, nav , null, null);
smnc.Add(sn);
}
dr.Close();
}
}
}
catch (System.Exception)
{
}
return smnc;
}
/// <summary>
/// 当前结点的父结点
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
public override SiteMapNode GetParentNode(SiteMapNode node)
{
SiteMapNode sn = null;
//try
//{
string Description="";
int ID=0;
string Title="";
string URL="";
string[] Roles=null;
int DirID = 0;
byte TabType = 0;
//
System.Collections.Specialized.NameValueCollection nav = new System.Collections.Specialized.NameValueCollection();
bool ok = false;
using (DbCommand cmd = db.GetStoredProcCommand("dir_GetSiteMapParentNode"))
{
db.AddInParameter(cmd, "@ID", DbType.Int32, node.Key);
using (IDataReader dr = db.ExecuteReader(cmd))
{
int desp = dr.GetOrdinal("Description");
int idx = dr.GetOrdinal("ID");
int title = dr.GetOrdinal("Title");
int url = dr.GetOrdinal("URL");
int iroles = dr.GetOrdinal("Roles");
int tabType = dr.GetOrdinal("TabType");
int dirid = dr.GetOrdinal("DirID");
if (dr.Read())
{
Description = dr[desp].ToString();
ID = dr.IsDBNull(idx) ? 0 : dr.GetInt32(idx);
Title = dr[title].ToString();
if (Title.IndexOf("/") != -1)
Title.Replace("/", "_");
URL = dr[url].ToString();
DirID = dr.GetInt32(dirid);
TabType = dr.GetByte(tabType);
if (TabType == 1 && DirID == this.RID)
{
ID = this.MID;
}
string roles = dr[iroles].ToString();
string[] rolelist = null;
rolelist = roles.Split(new char[] { ':' }, 512);
Roles = rolelist;
nav = new System.Collections.Specialized.NameValueCollection();
nav.Add("MapID", DirID.ToString());
ok = true;
}
dr.Close();
}
}
if (ok)
{
sn = new SiteMapNode(this, ID.ToString(), URL, Title, Description, Roles, null, null, null);
}
else
{
sn = new SiteMapNode(this, "1", rurl, rtitle, rdesp, new string[] { "*" }, null, null, null);
sn.ParentNode = null;
}
//}
//catch (System.Exception)
//{
//}
return sn;
}
/// <summary>
/// 取根结点
/// </summary>
/// <returns></returns>
protected override SiteMapNode GetRootNodeCore()
{
SiteMapNode sm = new SiteMapNode(this, "1", rurl, rtitle, rdesp, new string[] { "*" }, null, null, null);
sm.ParentNode = null;
return sm;
}
/// <summary>
/// 是否允许当前用户访问
/// </summary>
/// <param name="context">当前上下文</param>
/// <param name="node">当前结点</param>
/// <returns></returns>
public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
{
return true;
}
/// <summary>
/// 初始化信息
/// </summary>
/// <param name="name"></param>
/// <param name="attributes"></param>
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection attributes)
{
if (String.IsNullOrEmpty(name))
name = "SqlSiteMapProvider";
rdesp = attributes["Description"];
if (string.IsNullOrEmpty(rdesp))
rdesp = "Studyez.com";
if (string.IsNullOrEmpty(attributes["HomePage"]))
throw new System.Configuration.ConfigurationErrorsException("SqlSiteMapProvider的参数配置错误!---HomePage---");
rurl = attributes["HomePage"];
if (string.IsNullOrEmpty(attributes["HomeName"]))
throw new System.Configuration.ConfigurationErrorsException("SqlSiteMapProvider的参数配置错误!---HomeName---");
rtitle = attributes["HomeName"];
prefix = attributes["Prefix"];
if (string.IsNullOrEmpty(attributes["Trace"]))
throw new System.Configuration.ConfigurationErrorsException("SqlSiteMapProvider的参数配置错误!---Trace---");
trace = attributes["Trace"];
base.Initialize(name, attributes);
}
}
------------附
1:web.config 中的配置
<siteMap enabled="true" defaultProvider="SqlSiteMapProvider">
<providers>
<add name="SqlSiteMapProvider" type="SqlSiteMapProvider2" Trace="1" HomePage="~/Default.aspx" HomeName="StudyEZ" Prefix="/StudyEZ" Description="Test For"/>
</providers>
</siteMap>
2:SiteMap 表结构
CREATE TABLE [dbo].[SiteMap](
[ID] [int] NOT NULL,
[Title] [varchar](200) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Description] [varchar](2000) COLLATE Chinese_PRC_CI_AS NULL,
[Url] [varchar](512) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Roles] [varchar](512) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_SiteMap_Roles] DEFAULT ('*'),
[Parent] [int] NOT NULL,
[DirID] [int] NOT NULL CONSTRAINT [DF_SiteMap_DirID] DEFAULT ((-1)),
[TabType] [tinyint] NOT NULL CONSTRAINT [DF_SiteMap_TabType] DEFAULT ((0)),
CONSTRAINT [PK_SiteMap] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
3:存储过程
create proc [dir_GetSiteMapNodeByRawURL]
@RawURL nvarchar(512)
AS select * from siteMap where url=@RawURL
create proce dir_GetSiteMapParentNode
@ID int
as select * from siteMap where ID=@ID