ASP.NET 3.5路由总结篇

<!--[endif]-->

URL Routing是非常重要的一块技术体系,笔者将URL Routing的知识进行梳理后得出本文,旨在同大家分享,希望能够起到抛砖引玉的作用。

 

1.    什么是URL Routing

 

所谓URL RoutingURL路由),指的是在Web中,URL不再是文件目录中的一个文件,而是一个说明有关URL路由的字符串,开发者可以自定义该字符串的格式。

 

2.    为什么要使用URL Routing

 

主要目的:URL更加的友好,方便web使用者理解相关页面的功能。至于其它目的嘛,这个就太广了,甚至可以在使用中慢慢挖掘它的用处。

 

3.    URL RoutingMVC才有的吗?

 

URL Routing的程序集System.Web.Routing位于.NET框架3.5SP1版本中,是与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 " )));
        }
    }
}
<!--[endif]-->

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中使用路由代码下载

  <!--[endif]-->

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 " }}
    }
 );
}

<!--[endif]-->

当URL路由处理一个URL请求时,本例中所定义的路由将产生如下列表格所示的结果。

URL

参数值

/Category

action = "show"

categoryName = "food"

/Category/add

action = "add"

categoryName = "food"

/Category/add/beverages

action = "add"

categoryName= "beverages"

<!--[endif]-->

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} " }}
      });
}

<!--[endif]-->

8.    Routing的扩展方法

 

扩展方法的由来:路由程序集(System.Web.Routing)是在2008811日更新的.NET 3.5框架SP1版本中发布的,而ASP.NET 3.5 MVC 1.0版本是在2009318日才正式发布。在ASP.NET MVC版本的不断改进中,微软的开发团队感觉到以往的路由设置给开发者带来不便,但是路由的程序集已经发布,所以将扩展方法加在了System.Web.Mvc程序集的RouteCollectionExtemsion类中。

关于Routing的扩展方法的UML及重载方法如下图所示:

 

 

  <!--[endif]-->

9.    如何自定义路由约束?

 

要实现自定义路由约束,实际上非常的简单,只需要实现IRouteConstraint接口中的Match()方法即可。

 

10.    如何优化路由设置?

 

Ø 将最常用的路由存放在路由表的最前面

Ø View中指定路由的名称。这样,就不会寻找其它匹配的路由。

 

11.    路由解析的工作机制分析

 

路由解析是按照一定的管道进行的,路由解析的管道图如下所示:

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值