设置URL路由
URL路径中,大括号{}内部的代表参数。/作为分割符,不再大括号内的则作为常量。值得注意的是,{controller}和{action}作为2个关键字由MVC路由控制,如果确实需要用这个名字命名参数,可以在前面加上@,例如{@action}。
默认的设置路由在Global.asax文件中
public static void RegisterRoutes(RouteCollection routes)方法
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
new { controller = "Home", action = "Index", id = UrlParameter.Optional }是MapRoute中的默认值,意思就是什么都不输入的时候,controller的值和action的值也是必须有值的。
controller代表控制器,action代表这个控制器中的方法。必须要指定默认的controller和action,不然会报错。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
实际上是以下方法的一种简写形式:
Route myRoute = new Route("{controller}/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary( new {
controller = "Home", action = "Index", id = UrlParameter.Optional
})
};
routes.Add("Default", myRoute);
路由的顺序也是十分重要,URL被一次匹配每个路由模式,一旦匹配成功,就不再继续匹配下去。这点要注意。例如:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", // Parameter defaults
id = UrlParameter.Optional }
);
routes.MapRoute(
"Specials", // Route name
"DailySpecials/{date}", // URL with parameters
new { controller = "Catalog", action = "ShowSpecials" } // Parameter defaults
);
这里的Specials将不会被匹配到。
URL路由匹配的时候只匹配路径部分,域名和QueryString不会被匹配到。
路由约束
可以使用正则表达式对参数进行验证约束
routes.Add(new Route("Articles/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(
new { controller = "Articles", action = "Show" }
),
Constraints = new RouteValueDictionary(new { id = @"\d{1,6}",id22=@"\d{1,6}" })
});
上面部分可以简写为如下代码:
routes.MapRoute(null, "Articles/{id}",
new { controller = "Articles", action = "Show" },
new { id = @"\d{1,6}",id22=@"\d{1,6}" }
);
不定长度的路径
使用*号匹配不定长度。
routes.MapRoute(null, "Articles/{*articlePath}",
new { controller = "Articles", action = "Show" }
);
可以匹配/Articles/Science/Paleontology/Dinosaurs/Stegosaurus
匹配硬盘上的文件
尽管设置了路由,但是如果在一些特殊的情况下,硬盘上真实存在的文件和路由的URL一致,这时系统会处理硬盘真实存在的文件,而无视路由的存在。
要解决这个问题,使得无论是否匹配了真实存在的文件,都按照路由的URL来处理,应该在Application_Start()中如下写:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteTable.Routes.RouteExistingFiles = true;
RegisterRoutes(RouteTable.Routes);
}
RouteTable.Routes.RouteExistingFiles默认是false。
这样设置了,就算文件真实存在都会按照路由的方式处理。除了下面2种情况:
1.没有任何匹配的路由。则仍然按照真实文件处理。
2.使用了IgnoreRoute(),无视了一些路由。