体验ASP.NET 4之URL Routing
2009-10-25 00:15 Jun1st 阅读(4041) 评论(16) 编辑 收藏 举报什么是URL Routing
首先,URL routing其实在ASP.NET 3.5 SP1中就被引入了,但是介于之前一直没有用到,况且微软的很多关于ASP.NET 4的介绍都把这作为一新的功能,因此就把题目取为这个吧。
之前,一个典型的ASP.NET的URL通常如下
http://www.myexample.com/salesreport.aspx?year=2009
在这个URL中的salesreport.aspx代表的是一个真实存在的物理文件,后缀.aspx在url中的存在不仅完全没有意义,而且使得这个url不是SEO-friendly的。而使用URL Routing之后,我们就可使用如下更简洁明了的地址来访问了,
http://www.myexample.com/salesrepot/2009
使用Route Engine进行URL Mapping
在asp.net mvc中,通过MapRoute将url映射到相应的controller和action, 而在web form中,在Global.assx的Application_Start中,我们通过MapPageRoute来将url映射到一个页面上
1.
void
RegisterRoutes(RouteCollection routes)
2.
{
3.
routes.MapPageRoute(
"SalesRoute"
,
"SalesReport/{year}"
,
"~/sales.aspx"
);
4.
}
MapPageRoute这里使用了三个参数,第一个是给这个Route的命名,第二个是这个URL的映射Pattern, 而最后一个就是对应的ASPX页面。除了这个最常用直接的方法之外,还可以使用其重载的其它方法,来个route设置default值,添加各种约束条件,如下面的这一个
01.
void
RegisterRoutes(RouteCollection routes)
02.
{
03.
routes.MapPageRoute(
"SalesRoute"
,
04.
"SalesRoute/{year}"
,
05.
"~/sales.aspx"
,
true
,
06.
new
RouteValueDictionary{
07.
{
"year"
, DateTime.Now.Year.ToString()}},
08.
new
RouteValueDictionary{
09.
{
"year"
, @
"\d{4}"
} });
10.
}
相比于第一个route,这个多了三个参数,第一个为boolean值,后面两个为RouteValueDictionary, 其中第一个就指定了一个default值,而最后一个就是一个约束,通过正则表达式约束了参数year必须是四位的数字。
在将SalesRoute/2009成功的映射到sales.aspx页面之后,如何在sales的code中获取这个“2009"值呢?通过Page类的RouteData来获取
1.
protected
void
Page_Load(
object
sender, EventArgs e)
2.
{
3.
string
year = RouteData.Values[
"year"
]
as
string
;
4.
}
使用Routing Engine生成URL
除了解析URL之外,我们同时可以生成这些简洁明了的URL, 如下面的代码
1.
RouteValueDictionary parameters =
new
RouteValueDictionary
2.
{
3.
{
"year"
,
"2008"
},
4.
{
"category"
,
"recreation"
}
5.
};
7.
VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(
null
,
"SalesRoute"
, parameters);
8.
hyperLnk.NavigateUrl = vpd.VirtualPath;
这里的SalesRoute就是我们在Application_Start中注册过的那个Route。 值得注意的是,在SalesRoute的Pattern中,我们并没有”{category}”,那么RouteEngine怎么处理这个值呢?这时,category就为被作为一个querystring添加到url中,生成的URL将会是这样的:
http://www.myexample.com/salesreport/2009?category=recreation
此外,如果在这个sales页面上加一个button,这个button对应的url会不会也会如上面的url那样简洁呢?答案是肯定的。但是是通过在Form标签中,指定Action来实现页面的回发。
总结
虽然这个新生添加Route功能并不能使Asp.Net Web Form变得像Asp.Net MVC那样让人心动,不过这至少是一个不错的功能。
Hope the post helps. Thanks