您好,登錄后才能下訂單哦!
前面的篇幅講解了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 BBBBB 13 { 14 public class HomeController : Controller 15 { 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}", // 帶有參數的 URL 4 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 <h3>@ViewBag.Name</h3>
此時我們再執行MVC項目后,如圖:
此時有的朋友可能會問,如果想讓系統現在AAAAA命名空間下搜尋如果沒***蛟贐BBBB下搜尋控制器,然后讓路由這樣定義:
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。這個值將會被傳遞到控制器工廠中,后續篇幅會講到。
這樣的結果是如果沒有搜索到指定的控制器系統也會停止搜索。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。