MVC Routing
路由:
“路由”是映射到处理程序的 URL 模式。 处理程序可以是物理文件,例如 Web 窗体应用程序中的 .aspx 文件。 处理程序还可以是处理请求的类,例如 MVC 应用程序中的控制器。 若要定义路由,可以通过指定 URL 模式、处理程序和(可选)路由名称,创建 Route 类的一个实例。通过将 Route 对象添加到 RouteTable 类的静态 Routes 属性,向应用程序中添加路由。 Routes 属性是一个存储应用程序的所有路由的 RouteCollection 对象。
Route类
Route类是抽象类RouteBase的子类,在Route类中设置了5个基本属性
名称 | 说明 | |
---|---|---|
![]() |
Constraints | 获取或设置为 URL 参数指定有效值的表达式的词典。 |
![]() |
DataTokens | 获取或设置传递到路由处理程序但未用于确定该路由是否匹配 URL 模式的自定义值。 |
![]() |
Defaults | 获取或设置要在 URL 不包含所有参数时使用的值。 |
![]() |
RouteHandler | 获取或设置处理路由请求的对象。 |
![]() |
Url | 获取或设置路由的 URL 模式。 |
名称 | 说明 | |
---|---|---|
![]() |
Route(String, IRouteHandler) | 使用指定的 URL 模式和处理程序类初始化 Route 类的新实例。 |
![]() |
Route(String, RouteValueDictionary, IRouteHandler) | 使用指定的 URL 模式、默认参数值和处理程序类初始化 Route 类的新实例。 |
![]() |
Route(String, RouteValueDictionary, RouteValueDictionary, IRouteHandler) | 使用指定的 URL 模式、默认参数值、约束和处理程序类初始化 Route 类的新实例。 |
![]() |
Route(String, RouteValueDictionary, RouteValueDictionary, RouteValueDictionary, IRouteHandler) | 使用指定的 URL 模式、默认参数值、约束、自定义值和处理程序类初始化 Route 类的新实例。 |
在最简单的构造函数中,需要传入URL模式和路由处理程序两个参数,而最复杂的则需要Route类中的5个基本属性
Route route = new Route( "Home/Index", // 路由名称 new RouteValueDictionary {{"controller","Home"},{"action","Index"}}, // 默认值 new RouteValueDictionary {{"date",@"\d{2}-\d{2}-\d{4}"}}, // 约束 new RouteValueDictionary {{"namespaces","Guest"}}, // 命名空间 new MvcRouteHandler() // 路由处理程序 );
RouteCollection类
在实际应用中,需要创建多个路由,而RouteCollection类就是用来管理这些路由集合的
void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { routes.Add(new Route ( "Category/{action}/{categoryName}" , new CategoryRouteHandler() )); }
MapRoute()扩展方法
名称 | 说明 | |
---|---|---|
![]() ![]() |
MapRoute(RouteCollection, String, String) | 映射指定的 URL 路由。 |
![]() ![]() |
MapRoute(RouteCollection, String, String, Object) | 映射指定的 URL 路由并设置默认路由值。 |
![]() ![]() |
MapRoute(RouteCollection, String, String, String[]) | 映射指定的 URL 路由并设置命名空间。 |
![]() ![]() |
MapRoute(RouteCollection, String, String, Object, Object) | 映射指定的 URL 路由并设置默认路由值和约束。 |
![]() ![]() |
MapRoute(RouteCollection, String, String, Object, String[]) | 映射指定的 URL 路由并设置默认的路由值和命名空间。 |
![]() ![]() |
MapRoute(RouteCollection, String, String, Object, Object, String[]) | 映射指定的 URL 路由并设置默认的路由值、约束和命名空间。 |
从上表中可以看出,各种扩展方法输入参数仍然是Route类中的5个基本属性,不过通过定义新的扩展方法,这些属性的类型有所改变,方便设置
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); routes.MapRoute( name: "Default", //1 路由名称 url: "{controller}/{action}/{id}", //2 URL 模式 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } //3 路由默认值 不再用RouteValueDictionary,简洁明了 ); }
URL 模式
URL 模式可以包含文本值和变量占位符(也称为“URL 参数”)。 文本和占位符位于由斜杠 (/) 字符分隔的 URL 段中。
当生成请求时,URL 分析为段和占位符,变量值提供给请求处理程序。 此过程类似于分析查询字符串中的数据并将该数据传递给请求处理程序的方法。 在两种情况下,变量信息都包括在 URL 中并以键值对的形式传递给处理程序。 对于查询字符串,键和值都位于 URL 中。 对于路由,键是在 URL 模式中定义的占位符名称,只有值位于 URL 中。
在 URL 模式中,可以通过用大括号({ 和 })括住占位符来定义占位符。 可以在一个段中定义多个占位符,但必须用一个文本值分隔开。 例如,{language}-{country}/{action} 是有效的路由模式。 但是,由于占位符之间没有文本值或分隔符,所以 {language}{country}/{action} 不是有效的模式。 因此,路由无法确定在哪里将 language 占位符的值与 country 占位符的值分隔开。
下表演示有效的路由模式和一些与模式匹配的 URL 请求的示例。
路由定义 |
匹配 URL 示例 |
---|---|
{controller}/{action}/{id} |
/Products/show/beverages |
{table}/Details.aspx |
/Products/Details.aspx |
blog/{action}/{entry} |
/blog/show/123 |
{reporttype}/{year}/{month}/{day} |
/sales/2008/1/5 |
{locale}/{action} |
/US/show |
{language}-{country}/{action} |
/en-US/show |
在存在多个路由的情况下,需要注意URL模式的顺序,因为路由匹配规则是由上而下,一旦找到匹配项就会停止匹配,并将请求转交处理程序,因此如果要做一些特殊的操作,则要将相应的路由放到前列