ASP.NET提供的站点地图为我们建立导航栏和菜单提供了极大的方便。此外我们还可以建立自己的站点地图提供程序,从而使我们的菜单项可控。
先来了解下menu等导航控件与站点地图的关系。我们在ASP .NET项目中所建立的web.siteMap 其实就是一个遵循一定规范的xml文件,我们叫它站点地图文件。Dot net 为我们定义了站点地图提供程序。这个站点地图提供程序所完成的任务就是要读出我们所需要作为导航的数据。例如ASP.NET 默认的站点地图提供程序是xmlSiteMapProvider(其实就是一个类),通常情况下,menu等web导航控件是通过此类读取web.siteMap文件中的数据的。
Dot net 中有默认的站点地图提供程序,同时它也允许我们自己创建自己的站点地图提供程序(类),也就是提供一个从其他数据源中读数据的类。多数情况下,我们的数据会存在数据库中,而不仅仅是固定在web.siteMap文件中。这时我们站点地图提供程序,便可以继承StaticSiteMapProvider类来完成了。实现此类有三个方法是必须重写的,它们是:Initialize,GetRootNodeCore和BuildSiteMap。
完成自己的站点地图提供程序后,我们还需要告诉ASP DOT NET 默认提供程序是我们新建的类。这需要在web.config配置文件中设置。代码如下:
<siteMap>
<providers>
<add name="mySiteMapProvider" type="SiteProviderExe" conn="Data Source=MICROSO-1PGF29S/SQLEXPRESS;Initial Catalog=Demo;User ID=sa;Password=123;"/>
</providers>
</siteMap>
要注意 这部分代码是在配置文件中的< system.web>标签中设置的。其中的类型(type)就是我们站点地图提供程序的类的类型,name则是随便起的,后面的字符串是连接数据库的字符串。
完成这后我们还需要在web.siteMap文件中添加节点:<siteMapNode provider="mySiteMapProvider" />,注意这就是刚才的name 。
再在数据库中存储好我们的文件就可以了。不过现在我们还没给自己供程序的站点地图提的实现代码呢,如下:
using System;using System.Data;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 System.Data.SqlClient;using System.Collections.Specialized;using System.Collections;using System.Security.Permissions;/**//// <summary>/// sqlsitemap 的摘要说明/// </summary>[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]//权限说明public class SiteProviderExe:StaticSiteMapProvider{ private SiteMapNode SMNode = null; private SiteMapNode rootNode = null; private SqlConnection conn = null; private string ConnString = "smcstring"; //申明 节点,数据库连接,连接字符串三个变量 public sqlsitemap() { } private bool initialized = false; public virtual bool IsInitialized {//重写基类IsInitialized属性,在调用基类 Initialize 之后在该方法中执行自己的初始化 get { return initialized; } } protected override SiteMapNode GetRootNodeCore() {//重写基类GetRootNodeCore方法,使之返回RootNode这个属性 return BuildSiteMap(); } public override void Initialize(string name, NameValueCollection attributes) {//重写基类Initialize方法,初始化数据连接,如果成功,那么将initialized设置为true if (IsInitialized) { return; } base.Initialize(name, attributes); //调用基类Initialize方法来初始化 string SqlConnString = attributes[ConnString]; if (SqlConnString == null) {//看数据库连接是否存在 throw new Exception("数据连接不存在"); } else {//初始化连接 conn = new SqlConnection(SqlConnString); } initialized = true; } protected override void Clear() { lock (this) { if (rootNode == null) base.Clear(); } } public override SiteMapNode BuildSiteMap() { lock (this) {//锁定 if (!IsInitialized) {//判断是否初始化了 throw new Exception("数据未初始化"); } else { if (rootNode == null) { Clear(); int rootNodeId = -1; if (conn.State == ConnectionState.Closed) {//如果当前连接是关闭的,就打开它 conn.Open(); } //循环 SqlCommand cmd = new SqlCommand("select rid,url,title,disp from rootsitemap where rn=0", conn); SqlDataReader sdr = cmd.ExecuteReader(); if (sdr.HasRows) { sdr.Read(); SMNode = new SiteMapNode(this, sdr.GetString(0), sdr.GetString(1), sdr.GetString(2), sdr.GetString(3)); } sdr.Close(); //进入ROOTNODE节点 SqlDataAdapter rootsda = new SqlDataAdapter("select rid,url,title,disp from rootsitemap where rn=1", conn); DataSet ds = new DataSet(); rootsda.Fill(ds, "root"); DataView rdv = ds.Tables["root"].DefaultView; if (rdv.Count > 0) { foreach (DataRowView drv in rdv) { rootNodeId = Convert.ToInt32(drv["rid"]); rootNode = new SiteMapNode(this, drv["rid"].ToString(), drv["url"].ToString(), drv["title"].ToString(), drv["disp"].ToString()); //进入子节点查询 SqlCommand childcmd = new SqlCommand("select nid,url,title,disp from sitemap where node=" + rootNodeId + "", conn); SqlDataReader childRead = childcmd.ExecuteReader(); if (childRead.HasRows) { SiteMapNode childNode = null; while (childRead.Read()) { childNode = new SiteMapNode(this, childRead.GetString(0).ToString(), childRead.GetString(1), childRead.GetString(2), childRead.GetString(3)); AddNode(childNode, rootNode); } } childRead.Close(); AddNode(rootNode, SMNode); } conn.Close(); } else { return null; } } } return SMNode; } }}
上面这个站点地图提供程序要从数据库中读数据,它用到了两张表,如下:


大体就是这样。实现的重点是要清楚站点地图提供程序的作用是从数据源中读出需要在menu等web导航控件中显示和连接的数据。本例中使用sql server作为数据源。但XMLSiteMapProvider 的数据源则是以siteMap为文件类型的文件。想整清楚,我们还需要看一下Systemweb 命名空间下StaticSiteMapProvider ,XmlsiteMapProvider,SiteMapNode 等类以及System.data命名空间下DataView等类的使用
本文介绍如何在ASP.NET中创建自定义站点地图提供程序,包括实现步骤、关键代码及数据库配置,帮助开发者灵活控制导航数据。
5636

被折叠的 条评论
为什么被折叠?



