本篇文章是初識Asp.Net MVC2.0 的后續(xù)的介紹。此文將從Routing未開放源代碼開始,還會對Asp.Net的Url重寫技術做個簡單介紹。并簡單介紹Asp.Net MVC2.0 Url路由技術的使用。
Url路由是MVC很重要的核心的一部分。不過它是單獨于MVC項目,而且沒有開源。它作為微軟的一個獨立的項目抽取了出來,在Asp.Net MVC中只是引用了這個dll。新建一個MVC Web項目,打開Global.asax。我們看到系統(tǒng)幫我們添加了using System.Web.Routing 引用。Routing作為一個單獨的dll被我們的項目引用。微軟并沒有對Routing進行開放源代碼。所以:Asp.Net MVC是開源的,但是Routing不是開源的!
首先講一下Asp.Net的Url重寫技術。一種最簡單實現(xiàn)Url重寫技術就是在Global.asax文件中
protected void Application_BeginRequest(object sender, EventArgs e) {
string originalUrl = Request.Url.PathAndQuery;//獲取原先的Url請求(假的請求)
//轉化成真的url請求....
HttpContext.Current.RewritePath(newurl);//將針對Url請求交給HttpContext
}
舉個例子:一個假的Url地址:http://www./news/sports-2009-1-1-201.html
看到上面的那個url其實很多情況下那不是一個真正的url,不一定存在sports-2009-1-1.html這么一個html頁。我們如果在Application_BeginRequest事件中將這個url重寫成這樣:
http://www./news/sports.aspx?date=2009-1-1&id=201 這才是真正的url!
現(xiàn)在開始講Asp.Net MVC的路由機制,首先要有個觀念就是:Asp.Net MVC的url地址是表現(xiàn)的web程序的一個邏輯的結構。新建一個Asp.Net MVC Web項目。然后按F5直接可以運行。頁面會自動跳轉到http://localhost:端口號/Home/Index頁面。玄機還是在Global.asax中??聪旅娲a:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute( "Default", // 路由名稱 "{controller}/{action}/{id}", // 帶有參數(shù)的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 參數(shù)默認值 new string[] { "MvcDemo.Controllers" } );
Global.asax中的RegisterRoutes方法中注冊了一個名字叫:Default的路由,格式是: http://localhost:端口號/controller/action 并添加了這條路由的默認值new { controller = "Home", action = "Index"}。所以我們按F5啟動的時候, 地址欄是:http://localhost:端口號/ 這個樣子,則匹配到我們的這條路由,并沒有具體值,就匹配了我們的默認值。 頁面會則自動跳轉到http://localhost:端口號/Home/Index頁面
本篇主要講述Routing組件的作用,以及舉幾個實例來學習Asp.Net MVC2.0 Url路由技術。 接著上一篇開始講,我們在Global.asax中注冊一條路由后,我們的請求是怎么轉到相應的View的呢?Controller和Action是怎么解析的?這就是Routing組件干的事情了。 Routing的作用:它首先是獲取到View傳過來的請求,并解析Url請求中Controller和Action以及數(shù)據(jù),其次他將識別出來的數(shù)據(jù)傳遞給Controller的Action(Controller的方法)。這是Routing組件的兩個重要的作用! 下面我們從幾個例子來講解一下Url路由的使用。 MapRoute()有6個方法可以重載,下面舉5個例子相應介紹! 實例一:首先講解的是系統(tǒng)默認提供的路由格式,下面是系統(tǒng)給的默認代碼: 1 2 3 4 5 6 7 8 9 10 | public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
routes.MapRoute(
"Default" , // 路由名稱
"{controller}/{action}/{id}" , // 帶有參數(shù)的 URL
new { controller = "Home" , action = "Index" , id = UrlParameter.Optional } // 參數(shù)默認值
);
}
|
Url格式為:http://localhost:0000/home/index 對應規(guī)則為:{controller}/{action}/{id} 黑體部分就是對應部分。這還是有默認值的情況。 詳細匹配應該為:http://localhost:0000/Custom/Detials/1 去掉主機域名,剩下的對應就是匹配Controller和actiong了。通過Routing組件解析這個Url,Controller是Custom,Action是Detials。傳遞過去的Id是1。 這就是使用了MapRoute( string name, string url, object defaults);這個方法的重載。
實例二:不使用默認值的Url路由規(guī)則 函數(shù)頭:MapRoute( string name, string url); routes.MapRoute("沒有默認值路由規(guī)則", "{controller}/{id}-{action}"); 適合的Url例子:http://localhost:0000/Custom/1-Detials
它將不匹配http://localhost:0000/ 實例三:帶名稱空間的Url路由規(guī)則 函數(shù)頭:MapRoute( string name, string url, string[] namespaces);//路由名,Url規(guī)則,名稱空間 routes.MapRoute( "MyUrl", // 路由名稱 "{controller}/{id}-{action}", // 帶有參數(shù)的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 參數(shù)默認值 new string[] { "MvcDemo.Controllers" }//命名空間 ); Url:http://localhost:0000/Custom/1-Detials
這個例子是帶命名空間的路由規(guī)則,這在Aeras使用時非常有用。不多說,后面再說! 實例四:帶約束的路由規(guī)則 函數(shù)頭:MapRoute( string name, string url, object defaults, object constraints);//路由名,Url規(guī)則,默認值,名稱空間 routes.MapRoute( "Rule1", "{controller}/{action}-{Year}-{Month}-{Day}}", new { controller = "Home", action = "Index", Year = "2010", Month = "04", Day = "21" }, new { Year = @"^\d{4}", Month = @"\d{2}" } ); Url:http://localhost:14039/home/index-2010-01-21 實例五:帶名稱空間,帶約束,帶默認值的路由規(guī)則 函數(shù)頭:MapRoute( string name, string url, object defaults, object constraints, string[] namespaces); routes.MapRoute( "Rule1", "Admin/{controller}/{action}-{Year}-{Month}-{Day}", new { controller = "Home", action = "Index", Year = "2010", Month = "04", Day = "21" }, new { Year = @"^\d{4}", Month = @"\d{2}" }, new string[] { "MvcDemo.Controllers" } ); Url:http://localhost:14039/Admin/home/index-2010-01-21 實例六:捕獲所有的路由 routes.MapRoute( "All", // 路由名稱 "{*Vauler}", // 帶有參數(shù)的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數(shù)默認值 ); 關于Global.asax剩余部分的說明: routes.IgnoreRoute("{resource}.axd/{*pathInfo}");是忽略這個規(guī)則的Url AreaRegistration.RegisterAllAreas();//注冊所有的Areas RegisterRoutes(RouteTable.Routes);//注冊我們寫的規(guī)則 //RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);//調試用語句,需要下載RouteDebug.dll,并添加引用!加入這句話后就可以測試Url路由了。
|