MVC 中的路由






4.83/5 (5投票s)
正如我们在上一篇文章中看到的,MVC 应用程序中的 Controller 是负责处理用户输入并定义应用程序逻辑的组件。它会对模型执行操作……文章 MVC 中的路由首先出现在 codecompiled.com。
正如我们在上一篇文章中看到的,MVC 应用程序中的Controller是负责处理用户输入并定义应用程序逻辑的组件。它会对模型执行操作,然后选择要呈现的视图。
路由有其自身的特定职责。它充当客户端请求和处理请求的 Controller 之间的接口。由于客户端不像 Web 窗体页面那样请求任何特定页面,因此路由组件的职责在 MVC 中更为重要。没有路由组件,请求就无法映射到特定的 Controller。像 http://www.ecommerce.com/product/1 这样的 URL 本身没有意义,正是因为路由组件,我们的应用程序才能处理该请求。
路由子系统包含一组路由。每条路由都包含有关该路由将匹配的请求以及哪个 Controller 和操作方法将处理该请求的信息。
1. 路由将匹配哪些请求由路由定义的 URL 模式识别。
2. 哪个 Controller 和操作方法将处理该请求由路由声明的 {action} 和 {controller} 参数识别。
我们将查看创建新 MVC 应用程序时创建的默认路由,并了解该路由如何处理上述两个点。
创建一个 MVC 项目,然后在 App_Start 文件夹中打开 RouteConfig.cs 文件。
它包含一个定义为的 RegisterRoutes 方法
public class RouteConfig { 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 } ); } }
RegisterRoutes 方法在应用程序启动时从 Application_Start 方法调用
正如我们在上面看到的,一个 routecollection 对象,routes,被传递给 RegisterRoutes 方法。这个集合对象包含我们应用程序定义的所有路由。
RouteCollection 类定义了一个名为 MapRoute 的方法,该方法用于向路由集合添加新路由。
在继续之前,让我们看看什么是路由。路由是我们定义的用于处理我们应用程序接收的请求的内容。路由具有一些重要特征
路由由名称标识
路由具有一个 URL 模式,用于匹配路由将处理的 URL。
URL 模式可以包含路由参数,这些路由参数只是从 URL 中提取值进行填充的变量。
路由可以为路由参数定义默认值。
如果我们以默认路由为例,则会向 MapRoute 方法传递一个名为 url 的参数。它的值为 “{controller}/{action}/{id}”。这个模式有三个段.
我们可以通过“/”字符来识别每个段。正斜杠 (“/”) 字符分隔 URL 模式中的每个段。此模式中的段都是路由参数。路由参数只是占位符,由花括号 {} 标识。每个段可以包含文字值或占位符,或两者的组合。
因此,以下 URL 模式是完全有效的。
url:"{segment1}/{segment1}/{segment3}"
重点是上面的 URL 模式将匹配任何包含三个段的 URL。这回答了我们上面讨论的第一个问题路由将匹配哪些请求
因此,我们新的 URL 模式将匹配以下 URL:
http://xx/yy/zz
虽然我们上面定义的模式是完全有效的,但它没有任何用处,因为它不会将请求转发到任何 Controller 类和操作方法。如果我们查看默认路由模式,它的定义如下:
"{controller}/{action}/{id}"
MVC 中的 {controller} 和 {action} 占位符具有特殊含义,因为它们代表将处理请求的 Controller 和操作方法。因此,如果我们使用 URL http://Home/Index 发起请求,则会调用 Home Controller 中的 Index 方法。第一个段对应于 Controller 名称,第二个段对应于将处理请求的操作名称。
因此,现在我们知道谁将处理请求由{action} 和 {Controller} 路由参数识别。
虽然我们上面声明了内置的 {action} 和 {controller} 参数,但我们可以在路由模式中声明自己的参数。我们可以使用它们将值传递给操作方法。因此,我们可以声明一个 {name} 路由参数,如下所示:
"{controller}/{action}/{name}"
name 参数的值将从 URL 中获取,并用于填充操作方法参数name。
我们已经了解了路由中的 URL 模式以及路由如何识别将处理请求的操作方法和 Controller。在声明路由时,还有其他几件事需要考虑。
默认参数值 我们可以为路由参数 defaults 参数定义默认值。如果 URL 不包含在 url 方法参数中指定的段,那么我们为 defaults 参数提供的值将用于 {action} 和 {controller} 参数。
正如我们之前所见,我们的默认路由定义如下:
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
如果我们不为 Controller 和操作方法提供值,defaults 参数值将用于这两个。如果我们查看项目属性,项目 URL 定义如下:因此,如果我们运行应用程序,请求的 URL 是应用程序的根 URL 或“/”。Home Controller 中的 Index 操作之所以被执行,是因为 defaults 参数将 Controller 的值设置为 Home,将 action 的值设置为 Index。
添加路由到路由集合时顺序很重要 我们添加到路由集合的路由按照我们添加它们的顺序与传入的请求进行匹配。因此,传入的 URL 将匹配我们添加到集合的第一个路由,如果找到匹配项,它将不会尝试将 URL 与其他路由的 URL 模式进行匹配。因此,如果我们一开始在路由集合中定义一个通用的 URL 模式,它将与任何 URL 匹配,那么我们其余的路由将不会与传入的 URL 匹配。
因此,正如我们所见,路由是 MVC 应用程序中的一个重要组件,它将请求映射到处理请求的操作方法。