初學ASP.NET MVC 學習筆記(三)
終於看到ASP.NET MVC Overview的最後一篇文章
Understanding Models, Views, and Controllers (C#)
這篇文章的內容再說明建立 ASP.NET MVC專案後的專案結構,以及所產生的範例程
式怎麼觀看之類的觀念。也更細的去說明M、V、C之間各自該扮演什麼樣的角色。看完
整個OverView之後,就算不會寫MVC,也能對MVC架構有個簡單的認識。
順道一提,今天去聽了微軟MSDN的講座,其中一場保哥演講的MVC實務開發經
驗,真的是講得太精采,一個半小時的內容,就抵過我過年一個星期埋頭對MVC的研
究,其中的極速開發,聽完之後真的覺得MVC太神奇了。過幾天我會把演講的內容依自
己的記憶整理一下發表出來。
回歸正題,今天演講內容,也有講到 ASP.NET Routing 的觀念。
不難發現,用MVC架構寫出來的網站,URL會跟用Web Forms的URL不一樣。
Web Forms的URL,例如說http://www.xxxx.com.tw/index.aspx ,在相對應的目錄中,就必
須要有一個叫index.aspx的檔案,否則,就會出現常見的404錯誤囉。
在MVC中呢,常看到URL為http://www.xxxx.com.tw/Home/index
但是在對應的目錄中,卻不見得找的到index,連aspx都被省略了。
為什麼呢?
該篇文章中也提到這個觀念
當瀏覽器發出 request 的時候,會經由ASP.NET Routing,去找到對應的Controller,以
及要執行的action,在Controller中看是要呼叫Model進行資料庫的讀取,或是商業邏輯,
或是什麼不做,然後轉到View去呈現。所以要丟出哪一個檔案,不是由URL去決定,是
依Route中的設定去決定。
而在MVC專案中,有一個檔案叫 Global.asax ,當中就是設定Route的規則,如下:
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
當初在研究時,也是有看沒有懂,不過今天聽完演講之後,就比較有感覺了。
19~23行的區塊,就是一個Route的規則,當然可以有很多個規則,這邊先解說預設的規
則是什麼。
20行是第一個參數,代表Route的名稱,可以自己隨便取。
21行是預設的格式,也就是說 分層三個區塊,Controller名稱 / action名稱 / 參數
假設傳進來的URL是 http://www.xxxx.com.tw/ CCCC / NNNN / 1
那對應到的Controller就是CCCC,執行該Controller的 NNNN action,參數是 1
如果傳進來的URL是http://www.xxxx.com.tw/ 這樣而已
那就是執行22行的預設值,會去找Home這個Controller,執行裡面的Index action,
參數為空字串,也就是沒有。
當初在研究時,還有苦惱一個問題,那action執行之後,怎麼知道要丟給哪個View呢?
其實是有規則的,預設 例如執行HomeController中的Index() acion,丟出來的View,就會
去找View資料夾中的Home資料夾下的Index.aspx。
現在聽完之後覺得好簡單,但是當初可是殺了我不少腦細胞!
果然應證一句話 "山路那麼難走,有人開墾過比較好走"
希望哪天我也能成為開墾的那個人。
最後呢,就是簡單的一句話,Model要肥,Controller要瘦,View要笨。
Model是邏輯的部分,因此能有更多的邏輯在裡面,是最好的。(當然要符合效能及需要)
Controller要瘦,儘量不要有邏輯在裡頭,Controller只負責接跟丟就好。
View要笨,儘量不要有太多邏輯和語法再View中,另外我個人覺得View也要嚴謹
因為HTML是多1px不可,少1px不行的,能有漂漂亮亮的View當然是最好啦。
MVC雖說是分三層,但是其實也可以依使用的需要,再多分幾層,
有更好的關注點分離(Separation of Concerns; SoC),寫出來的程式就更好維護及再利用。