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

