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

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方法。

public static class RouteCollectionExtensions
{
//其他成员
public static void IgnoreRoute(this RouteCollection routes, string url, object constraints);
public static void IgnoreRoute(this RouteCollection routes, string url);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);
public static Route MapRoute(this RouteCollection routes, string name, string url);
}

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

对于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”。

你可能感兴趣的:(学习ASP.NET,MVC5框架揭秘笔记,.net,asp.net,mvc)