Technical Blog of QuitGame

永不放弃的梦
数据加载中……
体验.net2.0的优雅(3) -- 为您的 SiteMap 添加 控制转发功能
    首先看一下一个标准的SiteMap文件(Visual Web Developer  自带)

<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
    
<siteMapNode title="Home" url="Default.aspx" description="This is my homepage" >
    
<siteMapNode title="Resume" url="Resume.aspx" />
    
<siteMapNode title="Links" url="Links.aspx" />
    
<siteMapNode title="Albums" url="Albums.aspx" >
      
<siteMapNode title="Photos" url="Photos.aspx" >
        
<siteMapNode title="Details" url="Details.aspx" />
      
</siteMapNode>
    
</siteMapNode>
    
<siteMapNode title="Register" url="Register.aspx" />
    
<siteMapNode title="Manage" url="Admin/Albums.aspx"  roles="Administrators">
            
<siteMapNode title="Photos" url="Admin/Photos.aspx" >
                
<siteMapNode title="Details" url="Admin/Details.aspx" />
            
</siteMapNode>
        
</siteMapNode>
    
</siteMapNode>
</siteMap>

        在ASP.net 页面中可以利用这个SiteMap 文件和 menu 控件配合生成网站目录,也可以用来和SiteMapPath 控件配合生成 “您现在的位置”。但是遗憾的是缺没有一个简单的办法利用此文件来进行控制转发。在 Struts Framework 里面,控制转发却是一个非常重要的功能,被人大肆的吹嘘---优雅。不过你不用急,在ASP.net里面,我们可以用几行代码完成这个操作。

using System;
using System.Web;
using System.Collections.Specialized;
using System.Collections;

/// <summary>
/// The helper class for sitemap
/// </summary>

public static class MySiteMap 
{
    
static NameValueCollection siteMapCol;
    
static MySiteMap() 
    
{        
        SiteMapNodeCollection smc 
= SiteMap.RootNode.GetAllNodes();
        siteMapCol 
= new NameValueCollection();

        IEnumerator ie 
= smc.GetEnumerator();
        
while (ie.MoveNext())
        
{
            siteMapCol[((SiteMapNode)ie.Current).Title] 
= ((SiteMapNode)ie.Current).Url;
        }

     }


    
/// <summary>
    
/// get url for title
    
/// </summary>
    
/// <param name="key">title</param>
    
/// <returns>url string for the title</returns>

    public static string FindForward(string key)
    
{
        
return siteMapCol[key];
    }


    
/// <summary>
    
/// get url for title
    
/// </summary>
    
/// <param name="key">title</param>
    
/// <param name="paramsFormat">parameters format</param>
    
/// <param name="paramsValue">parameters value</param>
    
/// <returns>url string for the title</returns>

    public static string FindForward(string key,string paramsFormat,params object[] paramsValue )
    
{
        
return String.Format(FindForward(key) + "?" + paramsFormat, paramsValue);
    }


    
public static void Forward(string key)
    
{
        HttpContext.Current.Response.Redirect(FindForward(key));
    }


    
public static void Forward(string key, string paramsFormat, params object[] paramsValue)
    
{
        HttpContext.Current.Response.Redirect(FindForward(key,paramsFormat,paramsValue));
    }


    
public static void Tranfer(string key)
    
{
        HttpContext.Current.Server.Transfer(FindForward(key));
    }


    
public static void Tranfer(string key, string paramsFormat, params object[] paramsValue)
    
{
        HttpContext.Current.Server.Transfer(FindForward(key, paramsFormat, paramsValue));
    }

}


以上是 FindForward, Forward , Transfer 三个方法的共六个重载,其中3个是可以给URL加参数的

FindForward : 可以根据 SiteMap 中的 title 找到对应的 URL
Forward :直接转发到  SiteMap 中 相应 title 对应的 URL 上去
Transfer :跟 Forward 功能,但是是在服务器端转发(保留了Context),也就是说浏览器看到的地址不变

实现原理很简单,我们在静态构造函数里面使用 SiteMap 提供的API把 SiteMap 读取出来存储到了一个集合里面,在需要的时候我们从集合众查找 URL ,仅此而已。

把以上代码存为 cs 文件,放在 App_Code里面,就可以安全放心的使用了 。

以下是使用实例:

Response.Write(MySiteMap.FindForward("Details"));

MySiteMap.Forward(
"Details""AlbumID={0}&Page={1}"14);

打印的结果:

/MyWebSite/Details.aspx?AlbumID=1&Page=4

不过尽管如此,还是有一个小小的遗憾,因为 vs 2005 为资源文件和配置文件都提供了生成强类型访问的机制,却没有为SiteMap 提供类似的机制,也就是说如果 title 书写错误的话,仍然只能得到运行时检查。


其他文章:

体验.net 2.0 的优雅(1) -- 异步WebService调用
体验 .net2.0 的优雅(2) -- ASP.net 主题和皮肤

posted on 2005-11-24 20:42 quitgame 阅读(2897) 评论(8)  编辑 收藏 网摘 所属分类: ASP.NET/WEB

评论

#1楼  2005-11-25 08:39 NoMagic      

看错,还以为是控制反转捏
    回复  引用  查看    

#2楼 [楼主] 2005-11-25 09:06 QuitGame      

@NoMagic
一个破SiteMap,有什么可以反转的?
    回复  引用  查看    

#3楼  2005-11-25 13:17 露雨城市.NET2.0和Sql Server 2005开发研究      

不错不错,是挺方便的。
    回复  引用  查看    

#4楼  2006-03-19 20:35 奇思软件      

如果我想在sitemap中加入
<siteMapNode title="关于奇思">
<siteMapNode title="关于我们" url="~/AboutUs/Default.aspx?racpath=%7caboutus&amp;acpath=%7caboutus%7caboutus" />
<siteMapNode title="招聘中心" url="~/AboutUs/Default.aspx?racpath=%7caboutus&amp;acpath=%7caboutus%7ccareer" />

</siteMapNode>
时他会出错如下
The 'url' property had a malformed URL
有啥办法可以解决吧?
    回复  引用  查看    

#5楼  2006-11-18 01:06 咖啡没茶浓 [未注册用户]

老大,帮个忙吧,话都说到这份上,就帮我这个小MM做一个sitemap文件吧我的主页liangtinghua.twww.cn ,还有我的油箱liangtinghua@yahoo.com
    回复  引用    

#6楼  2007-11-21 12:07 PPK      

我怎么不明白? 代码里为什么要用到接口呢? 如果说smc.GetEnumerator()返回的集合集成了IEnumerator接口的话,那么你为什么不直接 调用方法呢?而调用IEnumerator ie 来调用接口中的方法呢? 我是新手,实在不明白这里为什么要这么写,望楼主指点~
    回复  引用  查看    

#7楼 [楼主] 2007-11-21 19:14 quitgame      

@PPK
GetEnumerator 返回的就是接口 所以用接口
    回复  引用  查看    

#8楼  2007-11-22 10:19 PPK      

哦 这样 谢谢!
    回复  引用  查看    




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-11-24 20:52 编辑过
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:

相关链接: