初學ASP.NET MVC 學習筆記(四)-Route

初學ASP.NET MVC 學習筆記(四)

 

一連看了兩篇 MVC文件

ASP.NET MVC Routing Overview (C#)

Creating Custom Routes (C#)

第一天Overview的內容跟初學ASP.NET MVC 學習筆記(三)內容有些重疊

這邊就只補充我發現的一些小眉角(很無聊,不過對我來說好像發現新大陸一樣)

例如HomeController裡的Index() action,預設是寫成:

 


public ActionResult Index()
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

如果改成:


 public ActionResult Index(string id)//接受一個string參數
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

也是OK的。但如果是改成

 


 public ActionResult Index(int id) //接受一個int參數
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

就會出現錯誤,WHY?

因為在Global.asax檔裡面,我們預設的Route是:


routes.MapRoute(
         "Default",                                              // Route name
         "{controller}/{action}/{id}",                           // URL with parameters
           new { controller = "Test", action = "Index", id = "" }  // Parameter defaults
            );

當URL沒有指定id的時候,預設是""  <=空字串,但是如果只寫int的話,按語法int是數值型別,

不能為空值。所以有兩種改法:

第一種把action的參數改為 

 


 public ActionResult Index(int? id)  //代表允許數值型別為空值
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

第二種是改Global.asax,將預設id改成0


 routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Test", action = "Index", id = 0 }  // Parameter defaults
            );

 

這樣的話就可以正常執行。不過這邊的意思只是說可以這樣改,實際上要怎麼用,還是

依照實際運用狀況而定。(例如根本不在乎參數的話,接了也沒有用。)

 

 

第二篇是在教如何自訂一個Route的規則

例如今天我想要加一條規則,名稱叫Blog,

URL的格式為:URL/ Archive / {傳入日期參數},預設controller=Archive,action為Entry

就可以寫成這樣:


            routes.MapRoute(
               "Blog",                // Route name
               "Archive/{entryDate}", // URL with parameters 
               new { controller = "Archive", action = "Entry" } // Parameter defaults 
            );

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Test", action = "Index", id = "" }  // Parameter defaults
            );

這裡要注意的是順序,為什麼Blog的規則要寫在Default的規則上面呢?

因為Default的規則比較寬鬆,所以如果將上面的順序顛倒的話,

Blog的規則就執行不到了。

這邊我當初在看的時候有一點疑惑,就是寫{controller}  跟寫Archive 有什麼差別呢?

{controller} 我想成是一個變數,Archive 是一個實數。

====================下面淺灰色這段文字觀念有誤=============================

只要符合Blog規則的,就一定會去執行ArchiveController,也就是代表說,

第四行的new {controller=”Archive”….}是沒有意義的,

就算改成new {controller=”Home”….},只要符合Blog的規則,還是會去執行ArchiveController

儘管如此,第四行的controller="某某某" 還是不能省略,否則會有錯誤。

====================請參考阿森大的回覆 簡單明瞭=============================

最後呢,就是參數了

文章中提到MVC framework很聰明會自動幫我們轉換URL位於參數那個位置的型別

以往我們用QuerryString來傳遞參數的時候,抓到的值都是string,不過只要我們輸入的URL

符合我們要抓的參數型別,例如:URL/Archive/2010-01-01

在ArchiveController中的Entry action 寫成:

 


public ActionResult Entry(DateTime entryDate)
        { 
            return View();
        }

那執行時的結果就會是:

date

幫我們轉成DateTime的型別囉。

另外還是要注意,如果不是寫成DateTime? entryDate的話

 

參數轉換失敗,還是會出現錯誤的喔。