System.Web.Routing入门及进阶 下篇

 

System.Web.Routing入门及进阶 上篇

上面介绍的是最简单的一种定义方式。当然我们可以建立更复杂的规则。其中就包括设定规则的默认值以及设定规则的正则表达式。

UrlRouting高级应用

预计效果:

当我访问/a/b.aspx时就会转到Default.aspx?category=a&action=b在页面上显示
category:a
action:b

亦如果我访问/chsword/xxxx.aspx就会转到Default.aspx?category
=chsword&action=xxxx就会显示
category:chsword

action:xxxx

 

如果访问/chsword/就会转到 Default.aspx?category=chsword&action=index就会显示

 category:chsword

action:index

 

 首先我建立一个Route

routes.Add(
                
"Default",
                
new Route("{category}/{action}.aspx",
                          
new RouteValueDictionary(
                              
new
                                  {
                                      file 
= "Default",
                                      category 
= "home",
                                      action 
= "index"
                                  }), 
new MyRouteHandler()
                    )
                );

当然IHttpHandler的处理方式也要有所改变

为了方便查看我使用了下方法:

 

    context.Server.Execute(string.Format("/{0}.aspx?category={1}&action={2}",
              RequestContext.RouteData.Values.ContainsKey(
"file")
                
? RequestContext.RouteData.Values["file"].ToString()
                : 
"default",
              RequestContext.RouteData.Values.ContainsKey(
"category")
                
? RequestContext.RouteData.Values["category"].ToString()
                : 
"",
              RequestContext.RouteData.Values.ContainsKey(
"action")
                
? RequestContext.RouteData.Values["action"].ToString()
                : 
"")
                );

 

即/a/b.aspx是映射到Default.aspx?category=a&action=b

在Default.aspx中写如下代码:

 category:<%=Request.Params["category"%><br />
   action:
<%=Request.Params["action"%>

 

以显示传入的参数。

如果在IIS中设置Index.aspx时就算输入/a/也会访问到/a/index.aspx,即默认的会按RouteValueDictionary中设置的值自动补全

UrlRouting使用正则表达式规则

UrlRouting在定义的时候也可以按正则的规则来进行定义。

 

 

            routes.Add(
                
"zz",
                
new Route("{category}/{action}.chs",
                    
new RouteValueDictionary(
                        
new {
                            file 
= "Default",
                            category 
= "home",
                            action 
= "1"
                        }),
                        
new RouteValueDictionary(
                        
new {
                            action 
= "[\\d]+"
                        }),
                    
new MyRouteHandler()
                    )
            );

 

以上代码规定了action只能是数字则访问/a/1.chs可以正常访问。

而访问/a/b.chs则会显示未找到资源。

 

当然这是里可以使用更高级的正则表达式。

UrlRouting的技巧

排除UrlRouting的方法:

System.Web.Routing默认提供了一个IRouteHandlerStopRoutingHandler Class,经过它处理的URL不会被做任何处理

通常使用方法如下:

routes.Add(new Route("{resource}.axd/{*pathInfo}", new StopRoutingHandler()));

 

RouteHandler工厂:

其实IRouteHandler可以实现一个RouteHandler的简单工厂。

    public class RouteHandlerFactory : IRouteHandler
    {
        
string Name { getset; }
        
public RouteHandlerFactory(string name){this.Name = name;}
        
#region IRouteHandler 成员
        
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
            
if (this.Name == "mypage")
                
return new MyPage(requestContext);
            
if(this.Name="mypage1")
                
return new MyPage1(requestContext);
        }
        
#endregion
    }

 

 规定HTTP verbs,这里要使用System.Web.Routing中的HttpMethodConstraint

 

void Application_Start(object sender, EventArgs e) {
    RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes){
    
string[] allowedMethods = { "GET""POST" };
    HttpMethodConstraint methodConstraints 
= new HttpMethodConstraint(allowedMethods);
    Route reportRoute 
= new Route("{locale}/{year}"new ReportRouteHandler());
    reportRoute.Constraints 
= new RouteValueDictionary { { "httpMethod", methodConstraints } };
    routes.Add(reportRoute);
}

 

Demo程序代码下载:

 http://files.cnblogs.com/chsword/WebApplication3.rar

 

 

 

 

posted @ 2008-08-27 15:39 重典 阅读(21154) 评论(26) 编辑 收藏

 回复 引用 查看   
#1楼[楼主]2008-08-27 15:47 | 重典      
就两篇我还分1234真是。。。。已经改为上下篇
 回复 引用 查看   
#2楼[楼主]2008-08-27 15:53 | 重典      
最新改加入了Demo下载
 回复 引用   
#3楼2008-08-28 09:53 | 入门级[未注册用户]
楼主不厚道不给人家sf的机会哈哈
 回复 引用 查看   
#4楼2008-08-28 10:44 | IT爱好者      
Demo下载下来有问题,需要楼主改正啊
 回复 引用 查看   
#5楼[楼主]2008-08-28 10:52 | 重典      
@IT爱好者
我又下载重试了,没有问题的
是不是你没有准备好我事先列出的前提

 回复 引用   
#6楼2008-08-28 12:10 | 香水坏坏[未注册用户]
MVC启动比page模型更慢了
 回复 引用 查看   
#7楼[楼主]2008-08-28 12:20 | 重典      
@香水坏坏
是的,但是我想也不在于这个吧,ROR和Python比这个还慢的可怜

 回复 引用 查看   
#8楼2008-08-28 18:57 | Leven      
无聊乱逛中。。。
既然看到了,就支持下重典了。

 回复 引用 查看   
#9楼[楼主]2008-08-28 20:12 | 重典      
@Leven
l用户名是“乱问”的意思吗

 回复 引用 查看   
#10楼2008-08-29 19:06 | Leven      
这理解很绝啊...

 回复 引用 查看   
#11楼[楼主]2008-08-29 21:48 | 重典      
@Leven
lenovo不是来弄我吗。。。

 回复 引用 查看   
#12楼2008-09-19 11:34 | John Rambo      
"/a/b.aspx时就会转到Default.aspx?category=a&action=b"

如果我在aspx里写了
<a href="/Default.aspx?category=a&action=b">back home</a>
或者
<a href="/Default.aspx?category=a&action=b" id="lnk1" runat="server">back home</a>
那么Render输出的时候是否能输出为:
<a href="/a/b.aspx">back home</a> ?

Thanks.

 回复 引用 查看   
#13楼[楼主]2008-09-19 11:40 | 重典      
@John Rambo
不能,
这个URL可以用Url.Action生成(Asp.net mvc)或者自己写个方法来生成
或者直接写<a href="/a/b.aspx">back home</a>

 回复 引用 查看   
#14楼2008-09-19 15:05 | John Rambo      
@重典
谢谢。

 回复 引用 查看   
#15楼2008-09-28 02:23 | eclairs fisher      
我想知道 urlrouting 和我们用了好几年的自己做个 HttpModule 来 url重定向有啥区别。。。。
 回复 引用 查看   
#16楼[楼主]2008-09-28 09:14 | 重典      
@eclairs fisher
UrlRouting它已经置于.net中而UrlWrite只是一个方便用户的公开代码
好比有NUnit但是还是有VSTS的测试工具一样
除使用上的区别外,其它的,功能上也没骨太大的区别

 回复 引用 查看   
#17楼[楼主]2008-09-28 09:16 | 重典      
@eclairs fisher
还有一个区别

UrlWrite的规则是可以设置但是不可获取的
也就是你在程序中无法使用一个函数来根据规则自动改变连接
但是URLRouting可以,如:Aspnetmvc中的Helper

 回复 引用 查看   
#18楼2008-09-28 15:29 | eclairs fisher      
听起来很吸引人,mvc有没有详细一点的路线图之类的?什么时候能有rtm出来?要等到.net 3.5 sp2才有么?
 回复 引用 查看   
#19楼[楼主]2008-09-28 15:35 | 重典      
@eclairs fisher
估计Beta很快就会出了,正式版还得挺长时间吧,甚至是.net4.x
路线上嘛 也没有什么如果对Asp.net的基础的话就可以很快学会的

 回复 引用 查看   
#20楼2009-01-06 04:14 | 李宏      
--引用--------------------------------------------------
重典: @eclairs fisher
还有一个区别

UrlWrite的规则是可以设置但是不可获取的
也就是你在程序中无法使用一个函数来根据规则自动改变连接
但是URLRouting可以,如:Aspnetmvc中的Helper
--------------------------------------------------------
NO URLREWRITER也可以动态改变 把配置别放WEBCONFIG,放另一个XML文件里
动态的更改XML文件 然后重新加载XML文件到内存 我是这样实现的

 回复 引用 查看   
#21楼[楼主]2009-01-06 09:13 | 重典      
@李宏
不好意思,我想我这句可能没太写明白
我的意思是UrlWrite 没有UrlRouting这样的类似ASP.NET MVC Url.Action这样的写入参数就可以生成
重写后的地址的方法

 回复 引用 查看   
#22楼2009-03-20 20:35 | 迁徙      
刚刚听到Routing,支持博主!
 回复 引用 查看   
#23楼2009-12-20 16:39 | MicroGoogle      
支持楼主!
 回复 引用 查看   
#24楼2010-07-05 09:41 | 天地不仁      
好文~
 回复 引用 查看   
#25楼2010-09-14 19:32 | 空呵      
上篇说得挺好的,但下篇就写得不够详细,只列代码
 回复 引用 查看   
#26楼2011-04-12 14:22 | 梅叶冬青      
这个能不能做成象struts一样配置,太麻烦了