坚持,坚定,坚强

博客园 首页 新随笔 联系 订阅 管理

一. 什么 UrlRouting?

  用来配置一些URL的映射,使用户可以按你的规则来访问网站.,大家都称它为 url 路由,那我们就把它叫做路由器吧

  使用UrlRouting,一定要规定URL模式,它包括一个位置标识,它将在你请求网页时按这个规则返回给你内容. 当然,这个创建的规则完全是由你自己定义的。

  如我们在上网的时候常见到http://localhost/admin 之类的地址,后面没有接具体的页面,但实际上还是有内容返回给你看的。这就是传说中的伪静态!

 

二. UrlRouting的优点和缺点

  优点: 可以隐藏你的真实页面,让别人找不到,安全!提高seo优化效果。

  缺点:  里面的规则是需要自己定制,搞不好就系统崩溃。不利于调试。

 

三. UrlRouting 的规则写在哪里

  1. 在 global.asax 全局文件里面

  2. 在 web.config 里面进行设置

  3. 在另外的xml 文件里面统一存放

 

四. UrlRouting实现原理

  

为了方便大家理解我绘制了一个UML图,其中通过RouteTable的Routes这个属性可以获取一个RouteCollection的Singleton模式,虽然在其中并没有判断值不存在时才初始化的Singleton的标志性行为,但是它是在Application_Start事件中进行初始化的,并且直到应用程序进程终结,所以是Singleton模式的。

 

   

   而通过以下方式将Route添加到RouteTable.Routes中

   RouteTable.Routes.Add(new Route());

   以上代码仅为表示其流程,这个代码是不能正确执行的,因为Route没有提供无参构造函数。

   Route初始化时则是利用RouteValueDictionary来加入默认值及规则到Route中

   另外Route还有一个IRouteHandler的实现对象,IRouteHandler的实现对象提供了一个GetHttpHandler方法来获取用于处理URL的IHttpHandler。

 

五. UrlRouting的代码实现

  global.asax 文件里面的代码如下:

   

 public class MvcApplication : System.Web.HttpApplication
    {
        
/// <summary>
        
/// 创建一个路由表
        
/// </summary>
        
/// <param name="routes">路由集合,由asp.net 路由集合提供</param>
        public static void RegisterRoutes(RouteCollection routes)
        {
            
//表示.axd页面不经过路由处理
            
//如果说你有aspx页需要设置可以直接访问的话应该加上
            
//routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");这一句
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
           
            
//1、大家可以回忆一下Controller和Action的定义
            
//因为MVC与传统Aspx的最大不同就是访问是
            
//访问的Controller.Action即某类下的一个函数而不是aspx文件,
            
//要展现给用户哪一个aspx文件是由Controller决定的(即默认的同名规则)
            
//这个是文件默认自带的UrlRouting规则,是将Controller/Action/id的访问
            
//模式指向对应的Controller及Action
            routes.MapRoute(
                
"Default",                                              // 默认路由名称
                "{controller}/{action}/{id}",                           //  这是 url 解析格式 ,大括号括起来的是需要解析的参数 {controller}是找到对应的 控制器,{action}是控制器里面的对应的方法,{id}是默认提供的一个参数名,类似我们以往的 http://localhost/index.aspx?id=XXX 这url里面的id参数

                
new { controller = "Home", action = "Index", id = "" }//参数的默认值也就是如果各部分为空的话访问
               
//HomeController下的Index这个Action
               
//是默认的参数,当没有指定{controller}时 默认 "Home"这个控制器,当没有指定 {action}时 默认"Index" 这个执行方法,类似的  id 就是 如果没有指定{id} 则 使用这里的值
            );

        }
        
/// <summary>
        
/// 应用程序启动时调用事件
        
/// </summary>
        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }

 

 

六:  UrlRouting 规则

Ø 定义URL路由

  将用户请求的URL路由解析为一系列的离散值,该URL路由通过占位符定义URL的模式。在URL路由中,通过大括号({})定义占位符,这些占位符就是URL路由参数,而字符串中的“/”、“.”等符号则作为分隔符被URL路由解析这些离散的数据,对于不在小括号或者方括号中的信息则被视为一个常量。

有效的URL路由定义

匹配的URL例子

{controller}/{Action}/{id}

/products/show/beverages

{table}/Details.aspx

/products/ Details.aspx products:表名 Details.aspx为常量

blog/{Action}/{entry}

/ blog(常量) /show(相关控制器重的方法)/123(一个entry变量)

{reporttype}/{year}/{month}/{day}

/salesreporttype变量)/2008year变量)/1month变量)/5day变量)  

 

Ø 设定URL路由通配符

为了实现对一类URL路由的定义,可以使用星号来定义URL路由通配符。

假定url路由通配符为:query/{queryname}/{*queryvalues},

URL

通配符参数值

/query/select/bikes/onsale

Bikes/onsale

/query/select/bikes

bikes

/query/select

空白字符串

 

Ø 添加URL路由参数的约束

         Constraints=new RouteValueDictionary{{"locale","{a-z}{2}-{A-Z}{2}"},{year,@"\d{4}"}};

         Locale必须为英文字母,前面2位英文字母必须小写的,后面2位英文字母必须大写的。而year必须是4位数字。

URL

匹配结果

/en-us/2008

不匹配

/en-US/08

不匹配

/en-US/2008

Locale=”en-US”,year=”2008”

 

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类中。

优化路由设置

Ø 设置路由名称:在路由的设置中,路由名称是可选的输入参数,路由名称可以用来生成URL路由,但是在路由解析中没有什么作用。当开发者使用路由名称来生成url路由的时候,路由模块将快速定位到指定名称的路由。则不会通过查询的方式,一个接一个的查询。而是直接跳转到路由表中的对应路由名称的路由。

Ø 将常用的路由存放在路由表的最前面。该方法不仅提高生成url路由的效率,而且还提高路由解析的效率。这是因为在解析路由的过程中,一旦选找到匹配的路由,就停止路由解析。

但需要说明的是,在改变路由的存放位置时,需要注意路由的次序改变是否实质性影响匹配。

 

posted on 2011-07-04 10:21  老公鸡  阅读(377)  评论(1编辑  收藏  举报