支持QueryString的SiteMapProvider

asp.net 2.0XmlSiteMapProvider不支持页面的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;
        }

    }

}

posted @ 2008-04-05 09:49  曹立松  阅读(461)  评论(0)    收藏  举报