MVC 中的路由






4.54/5 (25投票s)
本文解释了 MVC 中的路由。路由引擎如何执行路由,以及如何为 URL 定义路由。
目录
引言
本文解释了 MVC 中的路由。路由引擎如何执行路由,以及如何为 URL 定义路由。
ASP.NET MVC 路由是一个模式匹配系统,负责将传入的浏览器请求映射到指定的 MVC 控制器操作。当 ASP.NET MVC 应用程序启动时,应用程序会向框架的路由表中注册一个或多个模式,以告诉路由引擎如何处理与这些模式匹配的任何请求。当路由引擎在运行时接收到请求时,它会将请求的 URL 与注册给它的 URL 模式进行匹配,并根据匹配的模式进行响应。让我们看图 1.1。
在图 1.1 中,我们可以看到路由引擎如何处理请求以及它发送的响应。它根据路由表中 URL 是否匹配进行响应。
- 当请求的 URL 匹配路由表中任何已注册的路由模式时,路由引擎会将请求转发给适合该请求的处理程序。之后,路由将被处理并在 UI 上呈现视图。
- 当请求的 URL 不匹配任何已注册的路由模式时,路由引擎通过返回 404 HTTP 状态码来指示它无法确定如何处理该请求。
路由的属性
ASP.NET MVC 路由负责确定对于给定的 URL 要执行哪个控制器方法。URL 由以下属性组成
当发出请求时,URL 会被解析为段和占位符,并将变量值提供给请求处理程序。此过程类似于查询字符串中的数据被解析并传递给请求处理程序的方式。在这两种情况下,变量信息都包含在 URL 中,并以键值对的形式传递给处理程序。对于查询字符串,键和值都在 URL 中。对于路由,键是 URL 模式中定义的占位符名称,只有值在 URL 中。
- 路由名称:路由是映射到处理程序的 URL 模式。处理程序可以是 MVC 应用程序中处理请求的控制器。路由名称可用作对给定路由的具体引用。
- URL 模式:URL 模式可以包含文字值和变量占位符(称为 URL 参数)。文字和占位符位于由斜杠(/)字符分隔的 URL 段中。
- 默认值:定义路由时,可以为参数分配默认值。默认值是一个包含默认路由值的对象。
- 约束:一组应用于 URL 模式的约束,用于更精确地定义它匹配的 URL。
理解默认路由
默认的 ASP.NET MVC 项目模板会添加一个通用路由,该路由使用以下 URL 约定将给定请求的 URL 分割成三个命名段。
url: "{controller}/{action}/{id}"
此路由模式通过调用 RouteCollection 的 MapRoute() 扩展方法进行注册。
当 MVC 应用程序启动时,global.asax 的 Application_Start()
事件处理程序会执行,调用App_Start目录下的 RouteConfig
类的 RegisterRoutes()
方法(App_Start/RouteConfig.cs)。RegisterRoutes()
路由有一个参数,该参数是一个名为 RouteCollection
的路由集合,其中包含应用程序中所有已注册的路由。图 1.2 代表了向路由表添加路由的默认方法。
通过示例进行路由
应用程序启动时,ASP.NET MVC 会通过搜索可用程序集来查找实现 System.Web.Mvc
的类来发现应用程序的所有控制器。IController
接口或派生自实现此接口的类,并且类名以 Controller 后缀结尾。当路由框架使用此列表来确定它能够访问哪个控制器时,它会从整个控制器类名中去掉 Controller 后缀。
在上一篇文章 使用 Repository 模式在 MVC 中进行 CRUD 操作 中,我实现了一个图书实体的创建、读取、更新和删除操作。因此,我们将使用这个例子来理解 URL 路由。对于 CRUD 应用程序,我们的默认路由与图 1.2 相同。
URL | 控制器 (Controller) | 操作 | ID |
---|---|---|---|
https://:4736/ | HomeController | 目录 | |
https://:4736/Book/ | BookController | 目录 | |
https://:4736/Book/Create | BookController | Create | |
https://:4736/Book/Edit/2 | BookController | 未使用。 | 2 |
表中(表 1.1)最后一个请求的 URL (https://:4736/Book/Edit/2) 与已注册的默认 URL 模式完全匹配,因为它满足了路由模式的每个段,但当我们不提供完整的请求 URL 时,路由引擎会根据默认路由模式自动调用控制器和操作方法。
结论
路由中的控制器和操作值不区分大小写。URL 路由模式相对于应用程序根目录,因此它们不需要以正斜杠(/)或虚拟路径设计符(~/)开头。