初學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();
}
那執行時的結果就會是:
幫我們轉成DateTime的型別囉。
另外還是要注意,如果不是寫成DateTime? entryDate的話
參數轉換失敗,還是會出現錯誤的喔。