在说路径选择之前,我们先来看一下, MVC 的请求生命周期:
路径选择
所有 MVC的通讯开始都像其它的网站那样,用一个URL请求。也就是说,仅管在URL中没有提到 Routing framework,但是 Routing framework是每一个 MVC请求的核心。
简单地说, Routing是一个模式匹配系统。在程序启动的时候,会注册一个或者多个的framework'route 表用来告诉routing system遇到匹配的模式应该怎么做。在运行时,当routing engine在接收到一个请求的时候,它会用这个请求的URL来和注册的URL patterns匹配。
当routing engine在它的route table发现匹配的模式后,它将会把请求提交到对应的处理程序。
下面是 routing图:
加外,如果请求的URL没有与任何注册的路由模式匹配的话,routing engine会通过返回一个404来表明无法找到对应的处理程序。
配置路由
MVC routes负责决定哪个controller的方法(或者controller的动作)来执行给定的URL。 MVC routes具有如下属性:
1、名称唯一
一个名称必须对应唯一的的route
2、URL模式
通过简单的模式把一个URL解析成具有意义的字段。
3、默认值
提供与对应字段的默认值
4、约束
一系列的约束应用到URL模式上,用来严格的定义URL对应的路由模式。
默认的 MVC 工程模板会添加一个一般的route,用如下的约束来将一个URL请求切割成三部分字段。wrapped with brackets ({}): “controller”, “action”, and “id”:
{controller}/{action}/{id}
route pattern通过调用程序运行时MapRoute()的扩展方法来进行注册。
方法位于App_Start/RouteConfig.cs
public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}
除了提供一个名字和URL模式,route也定义了一系列的默认参数用来处理符合route pattern的URL。
这是ASP。net利用“约定优于配置”的一个典型例子,当应用程序启动后, mvc通过查找在所有可用程序集中实现了System.Web.Mvc.IController(或者继承自实现该接口的类,如:System.Web.Mvc.Controller)接口的class,而且要是以controller结尾。当routing framework 通过使用这个列表找到对应的controller后,它会从该controller class去掉名称的controller后缀。比如说:AuctionsController is referred to as Auctions, and HomeController 代表 Home
接下来还有一点要说的是route是忽略大小写的。
URL route patterns默认是相当于根目录的,不用添加“/”或者“~/” Route patterns如果包含这些字符串的话,会抛出异常。
我们已经看到,URL routes可以包换丰富的信息。为了处理一个 MVC请求,routing engine要找到两个重要的信息:controller和action.这样,routing engin才可以把信息通过 runtime create and execute the specified action of the appropriate controller.