日期:2014-05-16  浏览次数:20998 次

Asp.Net MVC4 系列-- 进阶篇之路由(1)

创建一个路由  

打开 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()));


 

指定默认(default)

刚才说明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太多

 

定值Segment

场景1,所有请求中第一个Segment为”public”的,需要统一处理,因此定义一个路由:

     routes.MapRoute(name: "PublicReqRoute", url:"Public/{controller}/{action}",
                           defaults: new {controller = "PublicHome", action ="Index"});


示例url:http://mysite/Public

匹配结果:controller = PublicHome,action=In