日期:2014-05-16 浏览次数:21151 次
打开 RouteConfig.cs ,发现已经创建了一个默认路由 :
routes.MapRoute( name:"Default", url:"{controller}/{action}/{id}" // defaults: new { controller ="Home", action = "Index", id = UrlParameter.Optional } );
为了说明路由的url匹配过程,暂时comment掉default参数。
打开Global.cs ,可以看到路由配置文件已经注册:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
Asp.net MVC Framework 的路由部分,是插入在http pipeline中的,当接受到http请求,会寻找注册的路由表(在ApplicationStart时候注册,就是应用启动时候),找到路由规则,获取每个路由规则的pattern,试图匹配当前请求合适的那个route,匹配成功,则解析出controller和action,从controllerfactory找到相应的controller,把请求传递给action,如果请求中传参,路由还会解析出参数,给action。
下面是几种url匹配的例子:
http://mysite/Admin/Index |
Controller =Admin,Action=Index |
http://mysite/Index/Admin |
Controller=Index,Action=Admin |
http://mysite/Apples/Oranges |
Controller=Apples,Action=Oranges |
http://mysite/Admin |
匹配失败,Segment太少 |
http://mysite/Admin/Index/Soccer |
匹配失败,Segment太多 |
路由会调用route handler来完成路由过程,默认的,mvc应用会使用MVCRouteHandler.手动添加一个Route,就可以体现出来:
routes.Add("MyRoute",newRoute("{controller}/{action}", new MvcRouteHandler()));
刚才说明url匹配时候,拿掉了default参数,这时我们一起看看default参数的作用。
routes.MapRoute( name:"Default", url:"{controller}/{action}/{id}", defaults: new { controller = "Home", action ="Index", id = UrlParameter.Optional } );
可以看到最后一个参数,指定了一个默认的controller和action。
Mydomain.com |
Controller = Home ,action=Index |
Mydomain.com/Customer |
Controller=Customer ,action=Index |
Mydomain.com/Customer/List |
Controller=Customer, action=List |
Mydomain.com/Customer/List/All |
匹配失败,segment太多 |
routes.MapRoute(name: "PublicReqRoute", url:"Public/{controller}/{action}", defaults: new {controller = "PublicHome", action ="Index"});
示例url:http://mysite/Public
匹配结果:controller = PublicHome,action=In