ASP.NET MVC 路由(一)

 ASP.NET MVC路由()

前言

从这一章开始,咱们即将进入MVC的世界,在学习MVC的过程当中在网上搜索了一下,资料仍是蛮多的,只不过对于我这样的初学者来看仍是有点难度,本身就想看到有一篇引导性的资料能够帮助我初步的了解一下这部分知识,而后再去学习大神们写的资料。并非说看完文章就会能够开发、能够怎么怎么样,没有!这些都没有,只是让你在脑海中把这部份内容记住它们的模型图以及一个大概的在MVC框架中的位置或者是整个系统中的位置,说了这么多的目的就是让你们更好的了解基础知识,有了它之后的进阶会更轻松。服务器

什么是路由?

能够把路由提供的功能当作是一个组件,既然是组件在哪均可能会用到的,而它所提供的功能就是URL的映射,和URL输出。在传统的Web Form开发中可能路由映射到的处理程序是一个aspx文件,而在MVC中大多数状况下是映射的控制器和控制器行为,传统的模式咱们先无论,咱们是来学习MVC的。框架

 

路由的对象结构

先打开VS环境,新建一个MVC的项目,在项目中会看到一个名字叫Global.asax的文件,打开它,会看到是一个MvcApplication类型而且继承自HttpApplication,在这个MvcApplication类型中有个RegisterRoutes公共的静态函数,如图1-1函数

图1-1学习

这里要关注的是routes.MapRoute()这个方法,这个方法不是RouteCollection类型自己的方法,而是一个扩展方法,看一下扩展类型的定义:this

 1     //}
 2     // 摘要:
 3     //     扩展 System.Web.Routing.RouteCollection 对象以进行 MVC 路由。
 4     public static class RouteCollectionExtensions
 5     {
 6         
 7         public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, RouteValueDictionary values);
 8         public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, string name, RouteValueDictionary values);
 9         public static void IgnoreRoute(this RouteCollection routes, string url);
10         public static void IgnoreRoute(this RouteCollection routes, string url, object constraints);
11         public static Route MapRoute(this RouteCollection routes, string name, string url);       
12         public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);       
13         public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);       
14         public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);       
15         public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);       
16         public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
17     }

能够在上述的类型中看到许多MapRoute()方法的重载,而且方法的参数又有这么多,这个系列方法的意义在于向路由系统中添加你自定义的一个URL映射规则。怎么添加的呢?这是根据系统上下文中的RouteTable对象中的RouteCollection类型的属性Routes,而在MapRoute()方法中的实现说白了就是根据参数生成Route对象,而且添加Route对象到服务器中,而URL规则则是在Route对象的内部构造了。url

看一下示意图2:spa

图1-2code

从上图中能够看到,一个个的Route对象被注册到服务器端中,每一个Route对象自身携带着一则URL规则,暂时咱们只须要理解这么多,对于RouteData对象会在后续讲解。orm

既然上面说到了Route对象咱们就先来看一下路由Route对象的基础构造,如图1-3对象

图1-3

(ps:这个图不是结构图不是什么正规的画法,至关于一个思惟导图,让人看了能明白就行)

先从图1-3的MapRoute()方法开始提及吧,在这个方法的内部会生成一个Route对象,而且添加到当前的RouteCollection类型的对象中。

图1-4

在图1-4中MapRoute方法中的”Default”参数表示着Route对象的内部是有着Name这个属性值的,只是没有公开使用而已,能够经过这样的方式来对路由进行名称赋值。

”{controller}/{action}/{id}”参数对应的Route对象的Url属性,只不过在MapRoute内部作赋值操做的时候,Route对象Url属性的Set访问器也在作着额外的操做,对Url进行解析生成成Url的规则,这个内容在后面的篇幅会有讲到。

参数new {controller=”Home”,action=”Index”,id=UrlParameter.Optional}则会编译成一个动态类型,此类型中包含参数中定义的controller、action和id三个属性,在MapRoute()方法中会先判断类型是不是RouteValueDictionary类型,若是是的话会直接赋值到Defaults属性,不然会使用其它的方法把根据这个动态类型生成一个RouteValueDictionary类型实例。

这里捎带一句RouteValueDictionary类型出现频率较高,主要是由于Route对象的的几个属性都是这个类型,把它做为键值队来想就好了。

图1-5

这种思惟图没有重复,只是但愿做为初学者阅读完本篇事后能留下的总体印象就是最后的这幅图。

Route对象的属性和函数一篇是说不完的,文章的目的只是一个基础性的扫盲,铺设基础而已,会在后续的篇幅中说到Route对象的Url规则定义和RouteData的由来,以及RouteCollection对象的一些基础概念。

 

 

做者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面

相关文章
相关标签/搜索