URL Routing是非常重要的一块技术体系,笔者将 URL Routing 的知识进行梳理后得出本文,旨在同大家分享,希望能够起到抛砖引玉的作用。
1. 什么是 URL Routing ?
所谓 URL Routing( URL路由),指的是在 Web中, URL不再是文件目录中的一个文件,而是一个说明有关 URL路由的字符串,开发者可以自定义该字符串的格式。
2. 为什么要使用 URL Routing ?
主要目的: URL更加的友好,方便 web使用者理解相关页面的功能。至于其它目的嘛,这个就太广了,甚至可以在使用中慢慢挖掘它的用处。
3. URL Routing 是 MVC 才有的吗?
URL Routing的程序集 System.Web.Routing位于 .NET框架 3.5的 SP1版本中,是与 ASP.NET MVC 框架分离的,因此,在 WebForm项目中也可以使用路由。
4. 如何在 WebForm 中使用路由?
要在 WebForm中使用路由,只需要完成 4个步骤即可:
Ø 添加对 System.Web.Routing的引用;
Ø 创建一个实现 IRouteHandler接口的类,如 WebFormRouteHandler类;
Ø 在 Global.asax.cs中将我们创建的 RouteHandler进行全局应用配置;
Ø Web.config 中配置 System.Web.Routing 的引用
WebFormRouteHandler类的代码
using
System.Web;
using
System.Web.Routing;
using
System.Web.Compilation;
using
System.Web.UI;
namespace
RoutingInWebForm
{
public
class
WebFormRouteHandler:IRouteHandler
{
public
string
VirtualPath{
get
;
private
set
; }
public
WebFormRouteHandler(
string
virtualPath)
{
this
.VirtualPath
=
virtualPath;
}
public
IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var page
=
BuildManager.CreateInstanceFromVirtualPath(VirtualPath,
typeof
(Page))
as
IHttpHandler;
return
page;
}
}
}
Global.asax.cs的代码
using
System;
using
System.Web.Routing;
namespace
RoutingInWebForm
{
public
class
Global : System.Web.HttpApplication
{
protected
void
Application_Start(
object
sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public
static
void
RegisterRoutes(RouteCollection routes)
{
routes.Add(
"
Named
"
,
new
Route(
"
foo/bar
"
,
new
WebFormRouteHandler(
"
~/WebForm1.aspx
"
)));
routes.Add(
"
Number
"
,
new
Route(
"
one/two/three
"
,
new
WebFormRouteHandler(
"
~/WebForm2.aspx
"
)));
}
}
}
Web.config中配置 System.Web.Routing的引用的代码如下:
<
httpModules
>
<
add name
=
"
UrlRoutingModule
"
type
=
"
System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35
"
/>
</
httpModules
>
在WebForm中使用路由代码下载
5. 如何定义 URL Routing ?
开发者一般通过 Global.asax.cs文件,在 Application_Start()中设置路由定义,通过静态类 RouteTable的属性 Routes来设置 URL路由,关于 URL Routing的定义,是比较灵活的。
6. 如何设定 URL Routing 的参数默认值?
当你定义一个路由时,你可以把一个缺省的值赋给一个参数。如果URL中没有提供此参数值,那么将使用此缺省值。你可以为一个路由设置缺省值,这可以通过把一个字典赋值给Route类的Defaults属性来实现。下列示例给出了一个带有缺省值的路由。
设定URL Routing的参数默认值代码
void
Application_Start(
object
sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public
static
void
RegisterRoutes(RouteCollection routes)
{
routes.Add(
new
Route
(
"
Category/{action}/{categoryName}
"
new
CategoryRouteHandler()
)
{
Defaults
=
new
RouteValueDictionary
{{
"
categoryName
"
,
"
food
"
}, {
"
action
"
,
"
show
"
}}
}
);
}
当URL路由处理一个URL请求时,本例中所定义的路由将产生如下列表格所示的结果。
URL |
参数值 |
/Category |
action = "show" categoryName = "food" |
/Category/add |
action = "add" categoryName = "food" |
/Category/add/beverages |
action = "add" categoryName= "beverages" |
7. 如何为 URL Routing 添加约束?
当你把路由定义添加到路由集合时,你可以添加约束条件。下面的示例添加的约束用于限制在locale和year参数中应该包括什么样的值。
URL Routing添加约束代码
void
Application_Start(
object
sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public
static
void
RegisterRoutes(RouteCollection routes)
{
routes.Add(
new
Route
(
"
{locale}/{year}
"
,
new
ReportRouteHandler()
)
{
Constraints
=
new
RouteValueDictionary
{{
"
locale
"
,
"
{a-z}{2}-{A-Z}{2}
"
},{year,
@"
/d{4}
"
}}
});
}
8. Routing 的扩展方法
扩展方法的由来:路由程序集( System.Web.Routing )是在 2008 年 8 月 11 日更新的 .NET 3.5 框架 SP1 版本中发布的,而 ASP.NET 3.5 MVC 1.0 版本是在 2009 年 3 月 18 日才正式发布。在 ASP.NET MVC 版本的不断改进中,微软的开发团队感觉到以往的路由设置给开发者带来不便,但是路由的程序集已经发布,所以将扩展方法加在了 System.Web.Mvc 程序集的 RouteCollectionExtemsion 类中。
关于 Routing 的扩展方法的 UML 及重载方法如下图所示:
9. 如何自定义路由约束?
要实现自定义路由约束,实际上非常的简单,只需要实现 IRouteConstraint接口中的 Match()方法即可。
10. 如何优化路由设置?
Ø 将最常用的路由存放在路由表的最前面
Ø 在 View中指定路由的名称。这样,就不会寻找其它匹配的路由。
11. 路由解析的工作机制分析
路由解析是按照一定的管道进行的,路由解析的管道图如下所示:
#MySignature { BORDER-RIGHT: #e5e5e5 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #e5e5e5 1px solid; PADDING-LEFT: 60px; BACKGROUND: url(http://wlb.cnblogs.com/images/cnblogs_com/wlb/1.jpg) #fffefe no-repeat 1% 50%; PADDING-BOTTOM: 10px; BORDER-LEFT: #e5e5e5 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #e5e5e5 1px solid } #MySignature A:link { COLOR: #f60 } #MySignature A:visited { COLOR: #f60 } #MySignature A:active { COLOR: #f60 } #MySignature A:hover { COLOR: #f60; TEXT-DECORATION: underline } 作者: 深山老林
出处: http://wlb.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。