標籤:style blog http color strong 檔案
ASP.NET MVC路由(五)前言
前面的篇幅解說了MVC中的路由系統,僅僅是大概的一個實現流程,讓大家更清晰路由系統在MVC中所做的以及所在的位置,通過模糊的概念描寫敘述、思維導圖沒法讓您看到路由的實際運用,特此篇幅來說明一下簡單的示範範例。
路由的命名空間的定義
對於路由其中url規則、預設值、url參數約束這些的定義網上都有,本篇講一下路由中命名空間的定義。
大家都知道路由的作用,讓請求匹配到合理的控制器名稱,而且交由控制器工廠來組建控制器來運行請求。然而在項目中難免會命名出同樣名稱的控制器,我們來類比一下會發現什麼情況。
環境配置
在MVC項目中Controllers檔案上右擊->加入->控制器,命名為HomeController,而且選擇空模板。然後就不用管這個控制器了,什麼都不要做了,在此類型所在的命名空間之外加入下面代碼:
1 namespace AAAAA 2 { 3 public class HomeController : Controller 4 { 5 public ActionResult Index() 6 { 7 this.ViewBag.Name = this.GetType().FullName; 8 return View(); 9 }10 }11 }12 namespace BBBBB13 {14 public class HomeController : Controller15 {16 public ActionResult Index()17 {18 this.ViewBag.Name = this.GetType().FullName;19 return View();20 }21 }22 }
這個時候就是類比的項目中因為時間的推移引用越來越多的程式集以及各種項目,所可能帶來的反覆命名,此時Global.asax檔案裡的預設路由定義:
1 routes.MapRoute(2 "Default", // 路由名稱3 "{controller}/{action}/{id}", // 帶有參數的 URL4 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數預設值
我們也不用管,直接開始調試,則會看到下面這種錯誤,
這樣的情況給誰都不願意發生,假設我們此時僅僅須要AAAAA命名空間下的Home控制器怎麼辦?好辦,用路由來配置:
1 routes.MapRoute(2 "",3 "{controller}/{action}",4 new { controller = "Home", action = "Index" },5 null,6 new string[] { "AAAAA" }7 );
僅僅須要在MapRoute方法中將所需的命名空間定義為數組傳入就可以,此時我們右鍵AAAAA命名空間下的HomeController類型中的Index()方法,點擊加入視圖->加入,完畢後在項目的Views目錄下的Home目錄下有個Index.cshtml檔案就是加入的視圖檔案了,開啟而且加入例如以下代碼:
1 <h2>@ViewBag.Name</h2>
此時我們再運行MVC項目後,
此時有的朋友可能會問,假設想讓系統如今AAAAA命名空間下搜尋假設沒有則在BBBBB下搜尋控制器,然後讓路由這樣定義:
1 routes.MapRoute(2 "",3 "{controller}/{action}",4 new { controller = "Home", action = "Index" },5 null,6 new string[] { "AAAAA","BBBBB" }7 );
告訴朋友們這樣是不行的,假設AAAAA下沒有Home控制器還好,假設有系統還是會繼續搜尋BBBBB命名空間下的全部類型,關於這裡的詳細實現將在後面的預設控制器工廠篇幅中講到。
假設想僅僅在指定的命名空間下搜尋的必須是這樣定義:
1 Route route= routes.MapRoute(2 "",3 "{controller}/{action}",4 new { controller = "Home", action = "Index" },5 null,6 new string[] { "AAAAA" }7 );8 route.DataTokens["UseNamespaceFallback"] = false;
這裡的MapRoute()方法會返回一個Route對象,前面我們也說過Route對象的,僅僅只是在注冊路由的時候我們全然沒有必要擷取Route對象的引用,在這裡我們須要擷取到它,而且要把DataTokens屬性集中的UseNamespaceFallback鍵所相應的值設定為false。這個值將會被傳遞到控制器工廠中,興許篇幅會講到。
這種結果是假設沒有搜尋到指定的控制器系統也會停止搜尋。
金源
出處:http://blog.csdn.net/jinyuan0829
本文著作權歸作者和CSDN共同擁有,歡迎轉載,但未經作者允許必須保留此段聲明,且在文章頁面