AspNet站点地图小结
一、配置项目的站点地图路径
a) 通过修改站点地图的提供程序实现
Web.config
<system.web> 节点下
<siteMap defaultProvider="CRMSiteMapProvider"> //代表默认提供程序
<providers >
<add name="CRMSiteMapProvider" type="System.Web.XmlSiteMapProvider" siteMapFile="~/Web.sitemap"/>
<add name="SystemSiteMapProvider" type="System.Web.XmlSiteMapProvider" siteMapFile="~/Manager/Web.sitemap"/>
解析:
Name: 提供程序名
Type: 提供程序类型 System.Web.XmlSiteMapProvider
siteMapFile站点地图路径
</providers>
</siteMap>
b) 绑定不同的站点地图只需将数据源的SiteMapProvider 属性设置为对应配置的提供程序名称即可
二、站点地图的权限设置
1. 配置站点地图的权限
<siteMapNode url="" roles="总经理" title="UserAddddddddd" description=""></siteMapNode>
若有多个角色可以用 , 号隔开。
2. 配置站点地图的提供程序
<siteMap defaultProvider="CRMWebSiteMap" enabled="true">
<providers>
<add name="CRMWebSiteMap"
type="System.Web.XmlSiteMapProvider"
siteMapFile="~/Web.sitemap"
securityTrimmingEnabled="true"/>
</providers>
</siteMap>
注意: 要将securityTrimmingEnabled="true"设置为true
注 : 对于空URL节点起作用,其余节点不起作用
三、动态生成站点地图
a) 通过后台生成站点地图
1. 编写后台类(BLL DAL 等)
2. 在页面中加载导航内容
protected void Page_Load(object sender, EventArgs e)
{
bindTree(0,null);
}
private void bindTree(int parentid,TreeNode node)
{
BLL.BLLSiteMap b = new BLL.BLLSiteMap();
List<Models.SiteMap> siteMapList=b.getSiteMap(parentid);
foreach (Models.SiteMap siteMap in siteMapList)
{
TreeNode t = new TreeNode();
t.NavigateUrl = siteMap.Url;
t.Text = siteMap.Title;
t.Value = siteMap.Title;
bindTree(siteMap.Id,t);
if (node != null)
{
node.ChildNodes.Add(t);
}
else {
this.TreeView1.Nodes.Add(t);
}
}
}
b) 通过重写站点地图提供程序实现
1. 在web.config 文件中加入sitemap提供程序
<add name="SqlSiteMapProvider" type="SqlSiteMapProvider" connectionStringName="ConStr"/>
Type 对应后台实现其功能的类
2. 在AppCode文件夹下写对应的实现类
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.Configuration.Provider;
using System.Configuration;
using System.Collections.Generic;
using System.Web.Configuration;
using BLL;
using System.Collections.Specialized;
/// <summary>
/// CRMProvider 的摘要说明
/// </summary>
public class CRMProvider:StaticSiteMapProvider
{
public SiteMapNode root;
public string key;
private readonly object obj = new object();
public CRMProvider()
{
}
//重写其Initialize 方法注意重写的方法参数
//可以通过转到定义查看此方法
public override void Initialize(string name, NameValueCollection attributes)
{
base.Initialize(name, attributes);
if (attributes == null)
{
throw new ArgumentNullException();
}
if (string.IsNullOrEmpty(name))
{
name = "SqlSiteMapProvider";
}
key = name;
if (!attributes.HasKeys() || attributes["connectionStringName"] == null)
{
throw new ProviderException();
}
//获得连接字符串的名称
string connectionStringName = attributes["connectionStringName"].ToString();
if (string.IsNullOrEmpty(connectionStringName))
{
throw new ProviderException();
}
if (string.IsNullOrEmpty(WebConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString))
{
throw new ProviderException();
}
}
//继承StaticSiteMapProvider类需实现其方法
public override SiteMapNode BuildSiteMap()
{
SiteMapNode rootnode = new SiteMapNode(this,"root");
lock(obj){
if(root !=null){
return root;
}
rootnode.Title = "CRMaa";
rootnode.Url = "sss";
rootnode.Description = "CRM系统";
AddNode(rootnode,null);
root = rootnode;
GetSiteMapNode(0, RootNode);
}
return rootnode;
}
protected override SiteMapNode GetRootNodeCore()
{
lock(obj){
root = BuildSiteMap();
//注意SiteMapNode创建时需保证线程安全
//将其锁定
}
return root;
}
private void GetSiteMapNode(int parentid, SiteMapNode parentNode)
{
BLL.BLLSiteMap b = new BLLSiteMap();
List<Models.SiteMap> list = b.getSiteMap(parentid);
foreach (Models.SiteMap siteMap in list)
{
SiteMapNode node = new SiteMapNode(this, siteMap.Id.ToString());
node.Url = siteMap.Url;
node.Title = siteMap.Title;
node.Description = siteMap.Description;
AddNode(node, parentNode);
GetSiteMapNode(siteMap.Id, node);
}
}
}