Routing(路由)与 URL
URL 是用户访问 Web 应用时最直接的入口,它不只是'地址',更是应用对外暴露的资源表达方式。一个设计得好的 URL,通常会尽量满足这些原则:
- 用来表达资源,而不一定对应磁盘上的物理文件
- 简短、好记、易于输入
- 能反映站点结构
- 可以逐层拆分,去掉末尾后仍然有意义
- 尽量保持稳定,不要轻易变化
比如下面两个地址,你可能更愿意记住哪一个?
http://www.cnblogs.com/jiekzou/1.htmlhttp://www.cnblogs.com/jiekzou/1
如果是后者,服务器该怎么知道该把请求交给谁处理?这就是 MVC 路由要解决的问题。它负责把传入的 URL 映射到具体的控制器和 Action 方法,而不是一味去找物理文件。
传统上,URL 更像是在指向服务器上的某个文件;而在 MVC 里,它更多是在描述一次请求该交给谁处理。
路由的作用
路由的核心任务,是匹配传入的请求,并把它映射到合适的控制器、Action 以及参数上。实际执行时,ASP.NET MVC 会根据 Global.asax.cs 中配置的规则来判断该请求应该落到哪里。
Routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带参数的 URL 模式
new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional
} // 默认值
);
这里有两个细节很重要:
{controller}和{action}是保留的参数名,不能随意改- 路由匹配是按顺序进行的,先写的规则优先级更高,直到匹配成功为止
另外,路由系统里还有一个常见概念:RequestContext.RouteData,它保存了本次请求的路由信息,后面很多地方都会用到。
含字面值的路由
路由 URL 里不仅可以放参数,也可以直接写字面值。比如:
/jiekzou/{controller}/{action}/{id}
这表示请求路径必须以 jiekzou 开头,才能匹配到这条路由。例如:
/jiekzou/home/index/1
字面值和参数也可以混合使用。不过要注意,URL 片段之间要有明确的分隔,不能写成两个连续参数直接挤在一起,比如:
{controller}{action}-{id}
这种写法通常不符合路由匹配的预期。
路由约束
如果希望某些 URL 段只能匹配特定格式,可以给路由加约束。最常见的方式,就是用正则表达式限制参数内容。
routes.MapRoute(
"blog", // 路由名称
"{controller}/{action}/{id}", // 带参数的 URL
{
controller = ,
action = ,
id = UrlParameter.Optional
},
{
controller = ,
action =
}
);

