支持QueryString的SiteMapProvider
asp.net 2.0的XmlSiteMapProvider不支持页面的QueryString,下面的代码就是在SiteMapNode上增加了一个属性reliantOn,用来支持QueryString参数
sitemap文件:
 <?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
 <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
 <siteMapNode url="default.aspx" title="首页"  description="">
  <siteMapNode url="default.aspx" title="首页"  description="">
 <siteMapNode url="~/pages/StaffViewPage.aspx" title="查看员工权限"  description="" />
    <siteMapNode url="~/pages/StaffViewPage.aspx" title="查看员工权限"  description="" />
 <siteMapNode url="~/pages/MyPrivilegePage.aspx" title="我的权限管理"  description="" >
    <siteMapNode url="~/pages/MyPrivilegePage.aspx" title="我的权限管理"  description="" >
 <siteMapNode title="我代理的权限" url="~/pages/agentprivilegeList.aspx"/>
      <siteMapNode title="我代理的权限" url="~/pages/agentprivilegeList.aspx"/>
 <siteMapNode title="我委托的权限" url="~/pages/consignprivilegeList.aspx"/>
      <siteMapNode title="我委托的权限" url="~/pages/consignprivilegeList.aspx"/>
 <siteMapNode title="添加委托授权" url="~/pages/agentstaffprivilegepage.aspx"/>
      <siteMapNode title="添加委托授权" url="~/pages/agentstaffprivilegepage.aspx"/>
 </siteMapNode>
    </siteMapNode>
 <siteMapNode url="~/pages/ProjectIndexPage.aspx" title="系统首页"  description="" reliantOn="sysid">
    <siteMapNode url="~/pages/ProjectIndexPage.aspx" title="系统首页"  description="" reliantOn="sysid">
 <siteMapNode url="~/pages/AllRolesViewPage.aspx" title="角色管理"  description="" reliantOn="sysid">
      <siteMapNode url="~/pages/AllRolesViewPage.aspx" title="角色管理"  description="" reliantOn="sysid">
 <siteMapNode title="添加角色" url="~/pages/RoleAddPage.aspx" reliantOn="sysid"/>
        <siteMapNode title="添加角色" url="~/pages/RoleAddPage.aspx" reliantOn="sysid"/>
 <siteMapNode title="编辑角色" url="~/pages/RoleEditPage.aspx" reliantOn="sysid,roleid"/>
        <siteMapNode title="编辑角色" url="~/pages/RoleEditPage.aspx" reliantOn="sysid,roleid"/>
 <siteMapNode title="管理角色" url="~/pages/RoleManagePage.aspx" reliantOn="sysid,roleid"/>
        <siteMapNode title="管理角色" url="~/pages/RoleManagePage.aspx" reliantOn="sysid,roleid"/>
 </siteMapNode>
      </siteMapNode>
 <siteMapNode url="~/pages/AllOperationsViewPage.aspx" title="操作管理"  description="" reliantOn="sysid">
      <siteMapNode url="~/pages/AllOperationsViewPage.aspx" title="操作管理"  description="" reliantOn="sysid">
 <siteMapNode title="添加操作" url="~/pages/OperationsAddPage.aspx" reliantOn="sysid"/>
        <siteMapNode title="添加操作" url="~/pages/OperationsAddPage.aspx" reliantOn="sysid"/>
 <siteMapNode title="编辑操作" url="~/pages/OperationsEditPage.aspx" reliantOn="sysid,opid"/>
        <siteMapNode title="编辑操作" url="~/pages/OperationsEditPage.aspx" reliantOn="sysid,opid"/>
 <siteMapNode title="管理操作" url="~/pages/OperationsManagePage.aspx" reliantOn="sysid,opid"/>
        <siteMapNode title="管理操作" url="~/pages/OperationsManagePage.aspx" reliantOn="sysid,opid"/>
 </siteMapNode>
      </siteMapNode>
 <siteMapNode url="~/pages/AllResGroupViewPage.aspx" title="资源管理"  description="" reliantOn="sysid">
      <siteMapNode url="~/pages/AllResGroupViewPage.aspx" title="资源管理"  description="" reliantOn="sysid">
 <siteMapNode title="添加资源" url="~/pages/ResGroupAddPage.aspx" reliantOn="sysid"/>
        <siteMapNode title="添加资源" url="~/pages/ResGroupAddPage.aspx" reliantOn="sysid"/>
 <siteMapNode title="编辑操作" url="~/pages/ResGroupEditPage.aspx" reliantOn="sysid,resgroupid"/>
        <siteMapNode title="编辑操作" url="~/pages/ResGroupEditPage.aspx" reliantOn="sysid,resgroupid"/>
 <siteMapNode title="管理操作" url="~/pages/ResGroupManagePage.aspx" reliantOn="sysid,resgroupid"/>
        <siteMapNode title="管理操作" url="~/pages/ResGroupManagePage.aspx" reliantOn="sysid,resgroupid"/>
 </siteMapNode>
      </siteMapNode>
 <siteMapNode url="~/pages/PersonalPage.aspx" title="查看员工权限"  description="" reliantOn="sysid"/>
      <siteMapNode url="~/pages/PersonalPage.aspx" title="查看员工权限"  description="" reliantOn="sysid"/>
 </siteMapNode>
    </siteMapNode>
 </siteMapNode>
  </siteMapNode>
 </siteMap>
</siteMap>
 Web.config配置
  Web.config配置
 <siteMap enabled="true" defaultProvider="SiteMapDataProvider">
<siteMap enabled="true" defaultProvider="SiteMapDataProvider">
 <providers>
      <providers>
 <add name="SiteMapDataProvider" type="Tencent.OA.RightWay.Web.Components.SmartSiteMapProvider, Tencent.OA.RightWay.Web" siteMapFile="Web.sitemap"  />
        <add name="SiteMapDataProvider" type="Tencent.OA.RightWay.Web.Components.SmartSiteMapProvider, Tencent.OA.RightWay.Web" siteMapFile="Web.sitemap"  />
 </providers>
      </providers>
 </siteMap>
    </siteMap>
 代码实现:
  代码实现:
 using System;
using System;
 using System.Data;
using System.Data;
 using System.Configuration;
using System.Configuration;
 using System.Web;
using System.Web;
 using System.Web.Security;
using System.Web.Security;
 using System.Web.UI;
using System.Web.UI;
 using System.Web.UI.WebControls;
using System.Web.UI.WebControls;
 using System.Web.UI.WebControls.WebParts;
using System.Web.UI.WebControls.WebParts;
 using System.Web.UI.HtmlControls;
using System.Web.UI.HtmlControls;
 using System.Collections.Specialized;
using System.Collections.Specialized;
 namespace Tencent.OA.RightWay.Web.Components
namespace Tencent.OA.RightWay.Web.Components
 {
{
 /// <summary>
    /// <summary>
 /// 处理QueryString问题,通过在SiteMapNode增加reliantOn节点来解决
    /// 处理QueryString问题,通过在SiteMapNode增加reliantOn节点来解决
 /// </summary>
    /// </summary>
 public class SmartSiteMapProvider : XmlSiteMapProvider
    public class SmartSiteMapProvider : XmlSiteMapProvider
 {
    {
 public override void Initialize(string name, NameValueCollection attributes)
        public override void Initialize(string name, NameValueCollection attributes)
 {
        {
 base.Initialize(name, attributes);
            base.Initialize(name, attributes);
 this.SiteMapResolve += new SiteMapResolveEventHandler(SmartSiteMapProvider_SiteMapResolve);
            this.SiteMapResolve += new SiteMapResolveEventHandler(SmartSiteMapProvider_SiteMapResolve);
 }
        }
 /// <summary>
        /// <summary>
 /// 解析SiteMap节点的reliantOn,补全Request.Url的QuseryString
        /// 解析SiteMap节点的reliantOn,补全Request.Url的QuseryString
 /// </summary>
        /// </summary>
 /// <param name="sender"></param>
        /// <param name="sender"></param>
 /// <param name="e"></param>
        /// <param name="e"></param>
 /// <returns></returns>
        /// <returns></returns>
 SiteMapNode SmartSiteMapProvider_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
        SiteMapNode SmartSiteMapProvider_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
 {
        {
 if (SiteMap.CurrentNode == null)
            if (SiteMap.CurrentNode == null)
 return null;
                return null;
 SiteMapNode temp;
            SiteMapNode temp;
 temp = SiteMap.CurrentNode.Clone(true);
            temp = SiteMap.CurrentNode.Clone(true);
 Uri u = new Uri(e.Context.Request.Url.ToString());
            Uri u = new Uri(e.Context.Request.Url.ToString());
 SiteMapNode tempNode = temp;
            SiteMapNode tempNode = temp;
 while (tempNode != null)
            while (tempNode != null)
 {
            {
 string qs = GetReliance(tempNode, e.Context);
                string qs = GetReliance(tempNode, e.Context);
 if (qs != null)
                if (qs != null)
 {
                {
 if (tempNode != null)
                    if (tempNode != null)
 {
                    {
 tempNode.Url += qs;
                        tempNode.Url += qs;
 }
                    }
 }
                }
 tempNode = tempNode.ParentNode;
                tempNode = tempNode.ParentNode;
 }
            }
 return temp;
            return temp;
 }
        }
 /// <summary>
        /// <summary>
 /// 解析SiteMap节点的reliantOn,组合成QueryString字符串
        /// 解析SiteMap节点的reliantOn,组合成QueryString字符串
 /// </summary>
        /// </summary>
 /// <param name="node"></param>
        /// <param name="node"></param>
 /// <param name="context"></param>
        /// <param name="context"></param>
 /// <returns></returns>
        /// <returns></returns>
 private string GetReliance(SiteMapNode node, HttpContext context)
        private string GetReliance(SiteMapNode node, HttpContext context)
 {
        {
 //检查SiteMapNode节电是否支持reliance
            //检查SiteMapNode节电是否支持reliance
 if (node["reliantOn"] == null)
            if (node["reliantOn"] == null)
 {
            {
 return null;
                return null;
 }
            }
 NameValueCollection values = new NameValueCollection();
            NameValueCollection values = new NameValueCollection();
 string[] vars = node["reliantOn"].Split(",".ToCharArray());
            string[] vars = node["reliantOn"].Split(",".ToCharArray());
 foreach (string s in vars)
            foreach (string s in vars)
 {
            {
 string var = s.Trim();
                string var = s.Trim();
 //保证querystring中存在 var
                //保证querystring中存在 var 
 if (context.Request.QueryString[var] == null)
                if (context.Request.QueryString[var] == null)
 {
                {
 continue;
                    continue;
 }
                }
 values.Add(var, context.Request.QueryString[var]);
                values.Add(var, context.Request.QueryString[var]);
 }
            }
 if (values.Count == 0)
            if (values.Count == 0)
 {
            {
 return null;
                return null;
 }
            }
 return NameValueCollectionToString(values);
            return NameValueCollectionToString(values);
 }
        }
 /// <summary>
        /// <summary>
 /// 组合成QueryString字符串
        /// 组合成QueryString字符串
 /// </summary>
        /// </summary>
 /// <param name="col"></param>
        /// <param name="col"></param>
 /// <returns></returns>
        /// <returns></returns>
 private string NameValueCollectionToString(NameValueCollection col)
        private string NameValueCollectionToString(NameValueCollection col)
 {
        {
 string[] parts = new string[col.Count];
            string[] parts = new string[col.Count];
 string[] keys = col.AllKeys;
            string[] keys = col.AllKeys;
 for (int i = 0; i < keys.Length; i++)
            for (int i = 0; i < keys.Length; i++)
 {
            {
 parts[i] = keys[i] + "=" + col[keys[i]];
                parts[i] = keys[i] + "=" + col[keys[i]];
 }
            }
 string url = "?" + String.Join("&", parts);
            string url = "?" + String.Join("&", parts);
 return url;
            return url;
 }
        }
 }
    }
 }
}
 
sitemap文件:
 <?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="default.aspx" title="首页"  description="">
  <siteMapNode url="default.aspx" title="首页"  description=""> <siteMapNode url="~/pages/StaffViewPage.aspx" title="查看员工权限"  description="" />
    <siteMapNode url="~/pages/StaffViewPage.aspx" title="查看员工权限"  description="" /> <siteMapNode url="~/pages/MyPrivilegePage.aspx" title="我的权限管理"  description="" >
    <siteMapNode url="~/pages/MyPrivilegePage.aspx" title="我的权限管理"  description="" > <siteMapNode title="我代理的权限" url="~/pages/agentprivilegeList.aspx"/>
      <siteMapNode title="我代理的权限" url="~/pages/agentprivilegeList.aspx"/> <siteMapNode title="我委托的权限" url="~/pages/consignprivilegeList.aspx"/>
      <siteMapNode title="我委托的权限" url="~/pages/consignprivilegeList.aspx"/> <siteMapNode title="添加委托授权" url="~/pages/agentstaffprivilegepage.aspx"/>
      <siteMapNode title="添加委托授权" url="~/pages/agentstaffprivilegepage.aspx"/> </siteMapNode>
    </siteMapNode> <siteMapNode url="~/pages/ProjectIndexPage.aspx" title="系统首页"  description="" reliantOn="sysid">
    <siteMapNode url="~/pages/ProjectIndexPage.aspx" title="系统首页"  description="" reliantOn="sysid"> <siteMapNode url="~/pages/AllRolesViewPage.aspx" title="角色管理"  description="" reliantOn="sysid">
      <siteMapNode url="~/pages/AllRolesViewPage.aspx" title="角色管理"  description="" reliantOn="sysid"> <siteMapNode title="添加角色" url="~/pages/RoleAddPage.aspx" reliantOn="sysid"/>
        <siteMapNode title="添加角色" url="~/pages/RoleAddPage.aspx" reliantOn="sysid"/> <siteMapNode title="编辑角色" url="~/pages/RoleEditPage.aspx" reliantOn="sysid,roleid"/>
        <siteMapNode title="编辑角色" url="~/pages/RoleEditPage.aspx" reliantOn="sysid,roleid"/> <siteMapNode title="管理角色" url="~/pages/RoleManagePage.aspx" reliantOn="sysid,roleid"/>
        <siteMapNode title="管理角色" url="~/pages/RoleManagePage.aspx" reliantOn="sysid,roleid"/> </siteMapNode>
      </siteMapNode> <siteMapNode url="~/pages/AllOperationsViewPage.aspx" title="操作管理"  description="" reliantOn="sysid">
      <siteMapNode url="~/pages/AllOperationsViewPage.aspx" title="操作管理"  description="" reliantOn="sysid"> <siteMapNode title="添加操作" url="~/pages/OperationsAddPage.aspx" reliantOn="sysid"/>
        <siteMapNode title="添加操作" url="~/pages/OperationsAddPage.aspx" reliantOn="sysid"/> <siteMapNode title="编辑操作" url="~/pages/OperationsEditPage.aspx" reliantOn="sysid,opid"/>
        <siteMapNode title="编辑操作" url="~/pages/OperationsEditPage.aspx" reliantOn="sysid,opid"/> <siteMapNode title="管理操作" url="~/pages/OperationsManagePage.aspx" reliantOn="sysid,opid"/>
        <siteMapNode title="管理操作" url="~/pages/OperationsManagePage.aspx" reliantOn="sysid,opid"/> </siteMapNode>
      </siteMapNode> <siteMapNode url="~/pages/AllResGroupViewPage.aspx" title="资源管理"  description="" reliantOn="sysid">
      <siteMapNode url="~/pages/AllResGroupViewPage.aspx" title="资源管理"  description="" reliantOn="sysid"> <siteMapNode title="添加资源" url="~/pages/ResGroupAddPage.aspx" reliantOn="sysid"/>
        <siteMapNode title="添加资源" url="~/pages/ResGroupAddPage.aspx" reliantOn="sysid"/> <siteMapNode title="编辑操作" url="~/pages/ResGroupEditPage.aspx" reliantOn="sysid,resgroupid"/>
        <siteMapNode title="编辑操作" url="~/pages/ResGroupEditPage.aspx" reliantOn="sysid,resgroupid"/> <siteMapNode title="管理操作" url="~/pages/ResGroupManagePage.aspx" reliantOn="sysid,resgroupid"/>
        <siteMapNode title="管理操作" url="~/pages/ResGroupManagePage.aspx" reliantOn="sysid,resgroupid"/> </siteMapNode>
      </siteMapNode> <siteMapNode url="~/pages/PersonalPage.aspx" title="查看员工权限"  description="" reliantOn="sysid"/>
      <siteMapNode url="~/pages/PersonalPage.aspx" title="查看员工权限"  description="" reliantOn="sysid"/> </siteMapNode>
    </siteMapNode> </siteMapNode>
  </siteMapNode> </siteMap>
</siteMap>
 <siteMap enabled="true" defaultProvider="SiteMapDataProvider">
<siteMap enabled="true" defaultProvider="SiteMapDataProvider"> <providers>
      <providers> <add name="SiteMapDataProvider" type="Tencent.OA.RightWay.Web.Components.SmartSiteMapProvider, Tencent.OA.RightWay.Web" siteMapFile="Web.sitemap"  />
        <add name="SiteMapDataProvider" type="Tencent.OA.RightWay.Web.Components.SmartSiteMapProvider, Tencent.OA.RightWay.Web" siteMapFile="Web.sitemap"  /> </providers>
      </providers> </siteMap>
    </siteMap>
 using System;
using System; using System.Data;
using System.Data; using System.Configuration;
using System.Configuration; using System.Web;
using System.Web; using System.Web.Security;
using System.Web.Security; using System.Web.UI;
using System.Web.UI; using System.Web.UI.WebControls;
using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts;
using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls;
using System.Web.UI.HtmlControls; using System.Collections.Specialized;
using System.Collections.Specialized; namespace Tencent.OA.RightWay.Web.Components
namespace Tencent.OA.RightWay.Web.Components {
{ /// <summary>
    /// <summary> /// 处理QueryString问题,通过在SiteMapNode增加reliantOn节点来解决
    /// 处理QueryString问题,通过在SiteMapNode增加reliantOn节点来解决 /// </summary>
    /// </summary> public class SmartSiteMapProvider : XmlSiteMapProvider
    public class SmartSiteMapProvider : XmlSiteMapProvider {
    { public override void Initialize(string name, NameValueCollection attributes)
        public override void Initialize(string name, NameValueCollection attributes) {
        { base.Initialize(name, attributes);
            base.Initialize(name, attributes); this.SiteMapResolve += new SiteMapResolveEventHandler(SmartSiteMapProvider_SiteMapResolve);
            this.SiteMapResolve += new SiteMapResolveEventHandler(SmartSiteMapProvider_SiteMapResolve); }
        } /// <summary>
        /// <summary> /// 解析SiteMap节点的reliantOn,补全Request.Url的QuseryString
        /// 解析SiteMap节点的reliantOn,补全Request.Url的QuseryString /// </summary>
        /// </summary> /// <param name="sender"></param>
        /// <param name="sender"></param> /// <param name="e"></param>
        /// <param name="e"></param> /// <returns></returns>
        /// <returns></returns> SiteMapNode SmartSiteMapProvider_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
        SiteMapNode SmartSiteMapProvider_SiteMapResolve(object sender, SiteMapResolveEventArgs e) {
        { if (SiteMap.CurrentNode == null)
            if (SiteMap.CurrentNode == null) return null;
                return null; SiteMapNode temp;
            SiteMapNode temp; temp = SiteMap.CurrentNode.Clone(true);
            temp = SiteMap.CurrentNode.Clone(true); Uri u = new Uri(e.Context.Request.Url.ToString());
            Uri u = new Uri(e.Context.Request.Url.ToString()); SiteMapNode tempNode = temp;
            SiteMapNode tempNode = temp; while (tempNode != null)
            while (tempNode != null) {
            { string qs = GetReliance(tempNode, e.Context);
                string qs = GetReliance(tempNode, e.Context); if (qs != null)
                if (qs != null) {
                { if (tempNode != null)
                    if (tempNode != null) {
                    { tempNode.Url += qs;
                        tempNode.Url += qs; }
                    } }
                } tempNode = tempNode.ParentNode;
                tempNode = tempNode.ParentNode; }
            } return temp;
            return temp; }
        } /// <summary>
        /// <summary> /// 解析SiteMap节点的reliantOn,组合成QueryString字符串
        /// 解析SiteMap节点的reliantOn,组合成QueryString字符串 /// </summary>
        /// </summary> /// <param name="node"></param>
        /// <param name="node"></param> /// <param name="context"></param>
        /// <param name="context"></param> /// <returns></returns>
        /// <returns></returns> private string GetReliance(SiteMapNode node, HttpContext context)
        private string GetReliance(SiteMapNode node, HttpContext context) {
        { //检查SiteMapNode节电是否支持reliance
            //检查SiteMapNode节电是否支持reliance if (node["reliantOn"] == null)
            if (node["reliantOn"] == null) {
            { return null;
                return null; }
            } NameValueCollection values = new NameValueCollection();
            NameValueCollection values = new NameValueCollection(); string[] vars = node["reliantOn"].Split(",".ToCharArray());
            string[] vars = node["reliantOn"].Split(",".ToCharArray()); foreach (string s in vars)
            foreach (string s in vars) {
            { string var = s.Trim();
                string var = s.Trim(); //保证querystring中存在 var
                //保证querystring中存在 var  if (context.Request.QueryString[var] == null)
                if (context.Request.QueryString[var] == null) {
                { continue;
                    continue; }
                } values.Add(var, context.Request.QueryString[var]);
                values.Add(var, context.Request.QueryString[var]); }
            } if (values.Count == 0)
            if (values.Count == 0) {
            { return null;
                return null; }
            } return NameValueCollectionToString(values);
            return NameValueCollectionToString(values); }
        } /// <summary>
        /// <summary> /// 组合成QueryString字符串
        /// 组合成QueryString字符串 /// </summary>
        /// </summary> /// <param name="col"></param>
        /// <param name="col"></param> /// <returns></returns>
        /// <returns></returns> private string NameValueCollectionToString(NameValueCollection col)
        private string NameValueCollectionToString(NameValueCollection col) {
        { string[] parts = new string[col.Count];
            string[] parts = new string[col.Count]; string[] keys = col.AllKeys;
            string[] keys = col.AllKeys; for (int i = 0; i < keys.Length; i++)
            for (int i = 0; i < keys.Length; i++) {
            { parts[i] = keys[i] + "=" + col[keys[i]];
                parts[i] = keys[i] + "=" + col[keys[i]]; }
            } string url = "?" + String.Join("&", parts);
            string url = "?" + String.Join("&", parts); return url;
            return url; }
        } }
    } }
}
 
                     
                    
                 
                    
                 


 
     
                
            
        