学习ASP.NET MVC5框架揭秘笔记-ASP.NET MVC路由(一)

来源:互联网 发布:深度linux桌面 编辑:程序博客网 时间:2024/05/16 04:55

2.2ASP.NET MVC路由

ASP.NET的路由系统旨在通过注册路由模板与物理文件路径之间的映射进而实现请求地址与文件路径之间的分离,但对于ASP.NET MVC应用来说,请求的目标不再是一个具体的物理文件,而是定义在某个Controller类型中的Action方法。出于自身路由特点的需要,ASP.NET MVCASP.NET路由系统进行了相应的扩展。

2.2.1路由映射

通过前面的介绍我们知道,RouteTable的静态属性Routes返回的RouteCollection对象代表了针对整个应用的全局路由表,我们可以调用其MapPageRoute完成针对某个物理文件的路由。为了实现针对目标ControllerAction的路由,ASP.NET MVCRouteCollection类型定义了一系列的扩展方法,这些扩展方法定义在RouteCollectionExtensions类型中(该类型定义在“System.Web.Mvc”命名空间下)。

如下面代码片段所示,RouteCollectionExtensions定义了两组方法。方法IgnoreRoute用于注册用于需要被忽略的URL模式相匹配的路由模板,它对应于RouteCollection类型的Ignore方法。方法MapRoute帮助我们根据提供的路由规则(路由模板、约束和默认值等)进行路由注册,它对应于RouteCollectionMapPageRoute方法。

[cpp] view plaincopy
  1. public static class RouteCollectionExtensions  
  2. {  
  3. //其他成员  
  4. public static void IgnoreRoute(this RouteCollection routes, string url, object constraints);  
  5. public static void IgnoreRoute(this RouteCollection routes, string url);  
  6. public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);  
  7. public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);  
  8. public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);  
  9. public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);  
  10. public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);  
  11. public static Route MapRoute(this RouteCollection routes, string name, string url);  
  12. }  

由于ASP.NET MVC的路由注册与具体的物理文件无关,所以MapRoute方法中并没有一个表示文件路径的参数。与直接定义在RouteCollection中的IgnoreMapPageRoute方法不同的是,表示默认路由变量值和约束的参数defaultconstraints都不在是一个RouteValueDictionary对象,而是一个普通的object。这主要是为了编程上的便利,这样的设计使我们可以通过匿名类型的方式来指定这两个参数值。该方法在内部会通过反射的方式得到指定对象的属性列表,并将其转换为RouteValueDictionary对象,指定对象的属性名和属性值作为字典元素的KeyValue

对于ASP.NET MVC路由系统对请求URL进行路由解析后生成的RouteData对象来说,包含在Values属性的路由变量集合中必须包含目标Controller的名称。由于Controller名称仅仅对应着类型的名称(不含命名空间),而目标Controller实例能够被激活的前提是我们能够正确地解析出它的真正类型,所以如果一个应用中定义了多个同名的Controller类型,我们不得不借助于类型所在的命名空间来对他们予以区分。

我们在调用MapRoute方法的时候可以通过字符串数组类型的参数namespaces来指定一个命名空间的列表。对于注册的命名空间,我们可以指定一个代表完整命名空间的字符串,也可以使用“*”作为通配符表示任意字符内容(比如“Artech.Web.*”)。添加的命名空间列表最终被存储于Route对象的DataTokens属性表示的RouteValueDictionary对象中,对应的Key为“Namespaces”。MapRoute方法没有为初始化Route对象的DataTokens属性提供相应的参数,如果没有指定命名空间列表,所有通过该方法添加的Route对象的DataTokens属性总是一个空的RouteValueDictionary对象。

对于指向定义在Controller类型中某个Action方法的请求来说,如果路由表与之匹配,则具体匹配的Route对象的GetRouteData方法被调用并返回一个具体的RouteData对象。对请求实施路由解析得到的代表目标ControllerAction的名称的路由变量必须包含在该RouteDataValues属性中,其对应的变量名分别为“controller”和“action”。

0 0