现在的位置: 首页 > 综合 > 正文

自定义SiteMap提供程式之-:SqlSiteMapProvider2

2013年04月14日 ⁄ 综合 ⁄ 共 11158字 ⁄ 字号 评论关闭

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

 

抱歉!评论已关闭.