標籤:pat 反射 param register 需要 附加資料 option admin src
一、RouteData解析過程
在ASP.NET MVC中,伺服器收到來自用戶端的請求後,會經過一些列的處理拿到請求的資料,比如在Pipeline 管線事件中,通過訂閱適當的事件,將HttpContext作為參數傳入HttpContextWrapper進行封裝,然後取得當前路由集合的資料RouteData進行解析,拿到具體的參數,包括請求路徑、請求的參數、IRouteHandler等,通過IRouteHandler的GetHttpHandler返回一個IHttpHandler對象,通過該對象對請求進行處理,然後控制器工廠通過RouteData中匹配的Controller進行反射構造一個Controller,Controller調用IController的Excute方法,同樣是通過反射拿到當前請求的Action,最後執行Action,返回用戶端資料,完成本次的請求。整體流程圖如下所示:
在這個過程中,RouteData中的路由 起到了很大的作用。Routing的作用:首先通過HTTP請求,並解析Url請求中Controller和Action以及附加資料,其次將識別出來的資料傳遞給Controller的Action(Controller的方法)。這是Routing組件的兩個重要的作用!
二、路由規則執行個體解析
執行個體一:首先講解的是系統預設提供的路由格式,下面是系統給的預設代碼:
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 "Default", // 路由名稱 7 "{controller}/{action}/{id}", // 帶有參數的 URL 8 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數預設值 9 );10 }
Url格式為:http://localhost:80/home/index 對應規則為:{controller}/{action}/{id} 黑體部分就是對應部分。這還是有預設值的情況。
詳細匹配應該為:http://localhost:80/Custom/Detials/1 。去掉主機網域名稱,剩下的對應就是匹配Controller和actiong了。通過Routing組件解析這個Url,Controller是Custom,Action是Detials。傳遞過去的Id是1。這就是使用了MapRoute( string name, string url, object defaults);這個方法的重載。
執行個體二:不使用預設值的Url路由規則
函數簽名:MapRoute( string name, string url);
routes.MapRoute("沒有預設值路由規則", "{controller}/{id}-{action}");
適合的Url例子:http://localhost:80/Custom/1-Detials
它將不匹配http://localhost:80/
執行個體三:帶名稱空間的Url路由規則
函數簽名:MapRoute( string name, string url, string[] namespaces);//路由名,Url規則,名稱空間
1 routes.MapRoute(2 "MyUrl", // 路由名稱3 "{controller}/{id}-{action}", // 帶有參數的 URL4 new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 參數預設值5 new string[] { "MvcDemo.Controllers" }//命名空間6 );
Url:http://localhost:0000/Custom/1-Detials
這個例子是帶命名空間的路由規則,這在Aeras使用時非常有用。不多說,後面再說!
執行個體四:帶約束的路由規則
函數簽名:MapRoute( string name, string url, object defaults, object constraints);//路由名,Url規則,預設值,名稱空間
1 routes.MapRoute(2 "Rule1",3 "{controller}/{action}-{Year}-{Month}-{Day}}",4 new { controller = "Home", action = "Index", Year = "2010", Month = "04", Day = "21" },5 new { Year = @"^\d{4}", Month = @"\d{2}" }6 );
執行個體五:帶名稱空間,帶約束,帶預設值的路由規則
函數簽名:MapRoute( string name, string url, object defaults, object constraints, string[] namespaces);
1 routes.MapRoute(2 "Rule1",3 "Admin/{controller}/{action}-{Year}-{Month}-{Day}",4 new { controller = "Home", action = "Index", Year = "2010", Month = "04", Day = "21" },5 new { Year = @"^\d{4}", Month = @"\d{2}" },6 new string[] { "MvcDemo.Controllers" }7 );
Url:http://localhost:14039/Admin/home/index-2010-01-21
執行個體六:捕獲所有的路由
1 routes.MapRoute(2 "All", // 路由名稱3 "{*Vauler}", // 帶有參數的 URL4 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數預設值5 );
1 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//是忽略這個規則的Url
1 AreaRegistration.RegisterAllAreas();//註冊所有的Areas2 RegisterRoutes(RouteTable.Routes);//註冊自訂規則3 4 ////調試用語句,需要下載RouteDebug.dll,並添加引用!加入這句話後就可以測試Url路由了。5 //RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
【基礎】MVC路由規則