现在的位置: 首页 > 综合 > 正文

ASP.NET 3.5路由总结篇

2013年12月09日 ⁄ 综合 ⁄ 共 4298字 ⁄ 字号 评论关闭

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/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

抱歉!评论已关闭.