ASP.NET MVC路由(五)

 ASP.NET MVC路由(五)

前言

前面的篇幅講解了MVC中的路由系統,只是大概的一個實現流程,讓你們更清晰路由系統在MVC中所作的以及所在的位置,經過模糊的概念描述、思惟導圖無法讓您看到路由的實際運用,特此篇幅來講明一下簡單的示例。html

路由的命名空間的定義

對於路由當中url規則、默認值、url參數約束這些的定義網上都有,本篇講一下路由中命名空間的定義。c#

你們都知道路由的做用,讓請求匹配到合理的控制器名稱,而且交由控制器工廠來生成控制器來執行請求。然而在項目中不免會命名出相同名稱的控制器,咱們來模擬一下會發現什麼狀況。數組

環境配置

在MVC項目中Controllers文件上右擊->添加->控制器,命名爲HomeController,而且選擇空模板。而後就不用管這個控制器了,什麼都不要作了,在此類型所在的命名空間以外添加如下代碼:ide

 

 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文件中的默認路由定義:this

 

1 routes.MapRoute(
2                 "Default", // 路由名稱
3                 "{controller}/{action}/{id}", // 帶有參數的 URL
4                 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數默認值

咱們也不用管,直接開始調試,則會看到如下這樣的錯誤,如圖:url

這種狀況給誰都不肯意發生,若是咱們此時只須要AAAAA命名空間下的Home控制器怎麼辦?好辦,用路由來配置:spa

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項目後,如圖:xml

此時有的朋友可能會問,若是想讓系統如今AAAAA命名空間下搜尋若是沒***蛟贐BBBB下搜尋控制器,而後讓路由這樣定義:htm

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。這個值將會被傳遞到控制器工廠中,後續篇幅會講到。

這樣的結果是若是沒有搜索到指定的控制器系統也會中止搜索。

相關文章
相關標籤/搜索