ASP.NET MVC路由(五)

來源:互聯網
上載者:User

標籤:asp.net   mvc   .net   c#   

 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共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.