目录
1、什么是路由
举例什么是路由?假如你在上大学的时候,睡觉起晚了,醒来后发现宿舍同学都走光了,你想到上午还有课,但是不记得去哪个教室去上了,这时候你会查下课程表,然后就知道去哪个教室上课了。这个课程表就是你的路由。
网络中的路由器,路由器主要是在网络中做数据转发,连接Internet各个局域网和广域网,让他们互通,当我们打开一个浏览器访问网页的时候,请求的数据包要到达一个远程的服务器要经过路由器的层层转发。
在ASP.NET MVC中,路由有相似的作用,路由就是将输入的网页地址和控制器以及控制器的动作联系起来。
2、路由的注册
RegisterRoutes方法就是注册路由的方法。
方法参数 RouteCollection是一个集合对象,这个集合对象用来保存多项路由数据,一项路由数据就是某种形式的URL路径、和控制器以及Action的关系。根据这个关系,MVC才能执行到控制器部分。
那么怎么才能添加这种路由数据呢?
就是调用 routes.MapRoute方法。
第一个参数是 路由名称。
第二个参数是用参数表示的URL。
第三个参数是默认值,是匿名类型。
第一个参数路由名称,类似于字典中的key
第二个是用占位符表示的URL,如这样的地址
News就是 {controller},Detail就是{action},1就是{id}
3、URL的模式匹配
学生有两个问题:
- URL中的参数字符串是可以随便写吗,还是有什么限制?
- 第三个参数里面的属性名和URL的参数字符串有什么关系吗?
首先第二个参数URL占位符的字符串是可以随便定义的,比如下面
但是在MVC中,我们用的URL还是这种形式
那么我们可以改里面的字符串值吗,比如讲controller改为control,把action改为actioned,我们可以直接的告诉大家,这是不可以的。
MVC框架中会从字典中读取键值名是controll的数据,比如这里的值是Home,然后MVC得到需要执行的控制器是HomeController
当然,同样是从字典中读取键值名是action的数据,比如这里的值是Index,然后MVC得到需要执行的action是Index方法
如果这两个字符串写错的话,代码就执行不到相应的控制器和里面的Action了,所以我们一定注意,写成 {controller}/{action}/{id}是一种约定。
关于这个过程,我们会在后面剖析MVC的源码会有更深刻的理解。
4、由URL到控制器
我们知道,通过前面的路由注册代码,会最终形成一个路由的集合数据,我们可以把它简单的看成一个路由表。
那么通过这个路由表,程序是怎么从URL进入到控制器(controller)和动作(action)的呢?
我们通过一个流程来看一下。
请求到达MVC程序后,首先会经过 UrlRoutingModule,他可以过滤每一个请求,他会根据请求的URL从路由表中查找与URL匹配的路由,然后从匹配的路由中得到一个名称MvcHandler的HttpHandler。
HttpHandler的作用就不用多说了,她就是一个处理程序,ASP.NET页面实际也是一个处理程序。
得到了MvcHandler这个处理程序,就执行他的ProcessRequest()方法,在这个方法内部,找到controller,然后继续往下执行。
说道这里,大家可能有个疑问:某项路由数据是怎么联系上一个HttpHandler呢,我们通过一段MVC的源代码来看一下。