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

初學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),寫出來的程式就更好維護及再利用。