【基礎】MVC路由規則

來源:互聯網
上載者:User

標籤: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路由規則

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.