路由:
RouteCollection 对象。
Route类
| 名称 | 说明 | |
|---|---|---|
| Constraints | 获取或设置为 URL 参数指定有效值的表达式的词典。 | |
| DataTokens | 获取或设置传递到路由处理程序但未用于确定该路由是否匹配 URL 模式的自定义值。 | |
| Defaults | 获取或设置要在 URL 不包含所有参数时使用的值。 | |
| RouteHandler | 获取或设置处理路由请求的对象。 | |
| Url | 获取或设置路由的 URL 模式。 |
| 名称 | 说明 | |
|---|---|---|
| Route(String, IRouteHandler) | Route 类的新实例。 | |
| Route(String, RouteValueDictionary, IRouteHandler) | Route 类的新实例。 | |
| Route(String, RouteValueDictionary, RouteValueDictionary, IRouteHandler) | Route 类的新实例。 | |
| Route(String, RouteValueDictionary, RouteValueDictionary, RouteValueDictionary, IRouteHandler) | 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 中。
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模式的顺序,因为路由匹配规则是由上而下,一旦找到匹配项就会停止匹配,并将请求转交处理程序,因此如果要做一些特殊的操作,则要将相应的路由放到前列