mvc3中,通过url进行路由匹配时,会根据在注册路由时的顺序按序逐个匹配,匹配后根据url中的controller、action和参数执行对应controller中的action方法,没有匹配则会404。然而,如果url从路由表中匹配到了,但却没有对应的controller,也会返回404。所以,在添加路由时,需要根据路由的url格式加以区别,把匹配度高的路由尽量放到最后,把后来添加的路由放在前面。
注册路由方法:
public static Route MapRoute(
string name, //路由在路由列表里的唯一名字(两次MapRoute时name不能重复)
string url, //路由匹配的url格式
Object defaults, //路由url {占位符} 的默认值
Object constraints, //url的 {占位符} 的约束
string[] namespaces //这个是用于设置路由搜索的控制器命名空间!
)
在创建好mvc3项目时,系统会自动注册一个默认的路由,如下:
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
其中带{}的表示参数匹配,如果不带则表示字符串匹配,其中需要注意的是,默认值中,我们必须设置controller和action的默认值。
在进行访问时,只要url地址能够匹配到路由,系统则按照路由规则和请求的内容来访问,否则就按照路由的默认值来访问。
假设,我们的路由是默认的,即Default,当我们的url为:http://localhost:port/Route/Fun时,系统会根据url匹配到的路由的controller,即RouteController中执行Fun方法,默认值将不起作用;而当我们的url为:http://localhost:port时,系统会按照匹配的路由的默认值来执行,即执行HomeController中的Index方法。
同样的,在定义路由时,url格式中还可以不包含{controller},形式如下:
routes.MapRoute(
"Route", // 路由名称
"{action}", // 带有参数的 URL
new { controller = "Route1", action = "Index" } // 参数默认值
);
这个路由很简单,名称为Route,路由规则格式为:{action},控制器的默认值为Route1。当我们的url形如:http://localhost:port/Index时,系统也会匹配到名为Route的路由,控制器为Route1,接下来的流程就一样了。(注:Route在Default之前)
以上为参数匹配的方式。其实,路由还可以进行使用字符串匹配的方式。假设有如下定义的路由:
routes.MapRoute(
"字符串匹配路由",
"String/Sub/{id}", //路由url
new { controller = "Page", action = "GetContent", id= UrlParameter.Optional }
);
此时,当我们的url形如:http://localhost:port/String/Sub/2时,系统得到匹配路由“字符串匹配路由”,同时会调用controller为Page,Action为GetContent的方法,参数id值为2。当然,这个路由必须在路由url为{controller}/{action}/{id}的前面,或是注册路由中不存在对应的参数匹配的路由的情况下,即"{controller}/{action}/{id}", //路由url。