﻿# ASP.NET MVC 常見問題解答 Part 1

從上次 [徵求 ASP.NET MVC 常見問題與書籍內容建議](/post/2009/04/22/Request-for-Comment-on-my-new-ASPNET-MVC-book) 之後已經累積了不少人對於 [ASP.NET MVC](http://www.asp.net/mvc/) 的問題與疑慮，所以藉此批次回應各位的問題，希望讓 [ASP.NET MVC](http://www.asp.net/mvc/) 這個明日之星能夠得到越來越多人的重視，而且希望能讓大家相信 [ASP.NET MVC](http://www.asp.net/mvc/) 絕對是個優質 Web 開發架構，應該義無反顧的擁抱它。

其實從 **ASP.NET MVC 1.0** 面市之後，已經有不少優質的英文書籍出現，網路上學習資源也不少，若英文還不錯的人應該很輕易就可以透過自修學成。我目前正在著手撰寫 **ASP.NET MVC 2.0** 的中文書籍，預計明年 3 ~ 4 月會出版，不好意思讓大家久等了，敬請拭目以待。

### 常見問題解答

**1\. ASP.NET MVC 與傳統 ASP.NET Web Form 開發有什麼不同？**

ASP.NET Web Form 已經是 10 年前面市的技術了，走了那麼久的時間，大家也慢慢的看到許多當初沒想到的地方，雖然 ASP.NET Web Form 的元件化技術已經非常成熟，但利用 Web Form 開發 Web 應用程式還是會遇到許多瓶頸與限制，幾乎所有 ASP.NET 開發人員都會遇到這些惱人的問題，例如：

-   邪惡的 ViewState ( 用了像 GridView 這種超大控制項非常容易失控 )
-   控制項元件對 HTML 控制不夠直覺或太過複雜 ( 有網友說: **控制項很難控制** )
-   不容易採用 **TDD** ( 測試導向開發模式 ) 開發、也不容易撰寫**單元測試**

許多 ASP.NET 開發人員對 [MVC 設計樣式](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)非常陌生，而且 ASP.NET MVC 是一個今年才正式面市的全新技術，一個又新、又陌生的技術相信會讓許多人望之卻步，不過還是希望各位能以理性的態度看待一個全新的技術，以下是 ASP.NET MVC 擁有比 ASP.NET Web Form 還多優勢的地方：

-   清楚的 **關注點分離**(Separation of Concerns; SoC) 強迫你寫出較 Web Form 還更易於維護的程式
-   **開放特性** (完全開放原始碼) 與 **社群支持** (目前國外社群非常活躍)
-   可讓你完全控制 HTTP 輸出內容 ( 比 Web Form 好太多太多了 )
-   優秀的開發效率 (這也是一般人的疑慮，以下會有回應)
-   易於測試的架構
-   易於分工的架構

ASP.NET MVC 目前的缺點是：

-   缺法工具支援 ( 不像 Web Form 可讓你不懂 HTML, CSS, JavaScript 也能開發網站 )
-   缺法成熟的元件化技術支援 ( **Server Control** v.s. **HTML Helper** )

**推薦延伸閱讀**

-   [Comparing Web Forms And ASP.NET MVC](http://msdn.microsoft.com/en-us/magazine/dd942833.aspx)

**2\. 採用 ASP.NET MVC 技術必須捨棄傳統 ASP.NET Web Form 哪些東西？**

其實相差不多，把 [ASP.NET Page Framework](https://web.archive.org/web/20130619030639/http://support.microsoft.com/kb/305141) 提供的功能去掉，再加上 ASP.NET MVC 新增的一些東西，就等於 ASP.NET MVC 了，其中包括：

-   ViewState
-   [ASP.NET 追蹤](http://msdn.microsoft.com/zh-tw/library/bb386420.aspx)
-   [ASP.NET Web 伺服器控制項事件模型](http://msdn.microsoft.com/zh-tw/library/y3bwdsh3.aspx)
-   伺服器控制項 ( Server Control )
-   Default SiteMap Provider

除此之外，其他現有的 ASP.NET 技術都可以繼續使用，而且也完全沒改變！例如：ASP.NET Application Life Cycle, ASP.NET Provider Model (Membership, Profile, SiteMap, …), Web Caching, Session, Authentication, … 等等

**3\. 什麼情況適用 ASP.NET MVC 什麼情況適用 ASP.NET Web Form？**

我有幾個非常主觀的看法，供大家參考：

-   小網站適合用 ASP.NET Web Form，大網站適合用 ASP.NET MVC
-   參與開發人數少的網站用 ASP.NET Web Form，參與開發人數多的網站用 ASP.NET MVC
-   擁有大量現有 Web Form 程式的人建議繼續使用 ASP.NET Web Form
-   全新開發的網站建議採用 ASP.NET MVC

**4\. ASP.NET MVC 是否速度上會比 ASP.NET Web Form 慢？**

關於「速度」有幾個層面可說：

-   **開發速度 / 開發效率**

-   由於 ASP.NET MVC 是新技術，剛開始一定比你熟悉的 Web Form 開發速度慢
-   採用 ASP.NET MVC 開發一段時間後，絕對比 Web Form 開發速度快，而且可維護性會比 Web Form 好非常多。

-   **執行速度**

-   WebForm 的龐大 Page Framework 所耗用的 CPU 指令集絕對比 ASP.NET MVC 多很多，如果單就這點來看，ASP.NET MVC 絕對勝出！
-   事事無絕對，優秀的 ASP.NET Web Form 開發人員寫出來的 Code 還是可能比資淺的 ASP.NET MVC 開發人員寫的 Code 來的快！

**5\. 關於 ASP.NET MVC 的 M、V、C 真的可以各自獨立開發嗎？是否會有所限制？**

可以，但沒那麼絕對！**完全獨立開發**雖然可行，但你如果真的這麼做就會綁手綁腳的，而且失去工具支援，我指的「完全獨立開發」是指專案一開始就讓 M、V、C 獨立開發，沒什麼必要，但是可行。

M、V、C 的關係是既分工又合作，必須有點黏又不能太黏的情況下，才能發揮 ASP.NET MVC 的優勢。

依照我這半年多來的實務開發經驗，我覺得 M ( Model ) 是 MVC 架構的中心，先有 Model 之後，就可以讓 Controller 與 View 參考這些 Model (模型)，並且進行分工開發，最後在進行整合即可，這是我認為最有效率的開發方法。

**6\. 現有的 ASP.NET Web Form 專案是否可以逐步轉移至 ASP.NET MVC 專案？**

嚴格一點來說：沒辦法，必須重新來過、打掉重練！

輕鬆一點來說：可以，你可以將現有的 Web Form 程式跟 Data Access Layer (DAL) 的部分與 ASP.NET MVC 的 Model 共用，各頁面 Code Behind 的部分慢慢抽離至 ASP.NET MVC 的 Controller，以 JSON 回傳資料，慢慢把現有 Web Form 抽絲剝繭到只剩下前端呈現邏輯，最後再重新開發 View 將原有的 Web Form 轉成 ASP.NET MVC 的 View。

**7\. ASP.NET MVC 是否能夠讓 Programmer 和 Art 完美分工？**

永遠沒有「完美」這件事，我們公司的 Art 現在會用 Expression Web 設計網頁、自己規劃撰寫一些簡單的 jQuery 程式、自己規劃 MasterPage 與 Page 與 UserControl 等，現在只差把他教會如何用 Visual Studio 開發工具與如何使用 ViewModel 與基本的程式控制邏輯 (if, for, foreach, while, …)，這些如果他都學會的話，我覺得已經很完美了。這是有可能的！ ^\_^

**8\. ASP.NET MVC 是否支援** [**REST**](http://en.wikipedia.org/wiki/Representational_State_Transfer)**？**

這是一定的，支援得非常漂亮！若要說 ASP.NET MVC 骨子裡就是以 [REST](http://en.wikipedia.org/wiki/Representational_State_Transfer) 為主一點也不過份。

**9\. 對一個從其他語言 (Ruby, PHP) 跳過來接觸 ASP .NET，我在什麼樣的情況才需要導入 MVC 呢?**

如果你是 ASP.NET 的新手，建議你還是可以學習 Web Form，因為市面上 Web Form 的書非常多，你只要跳過 ViewState 與控制項這些主題 (這條件好像已經過濾掉很多書了)，其他部分在 ASP.NET MVC 都用的上。

相信我，對一個從其他語言 (Ruby, PHP) 跳過來接觸 ASP .NET 的開發人員來說，ASP.NET MVC 是你最好的選擇，你不需要像我一樣忍受 PHP 轉 ASP.NET Web Form 殘酷的陣痛期 (開發模式差很多)。

如果你學過其他語言的 MVC 架構，學習 ASP.NET MVC 也會得心應手，只要將一些基本的 .NET 開發技能學紮實一點即可，例如：C# ( VB.NET )、.NET 基礎、Visual Studio 開發工具、IIS、… etc.

其他必備的技能還有：HTML, CSS, JavaScript, DOM, jQuery, HTTP, JSON, … etc.

如果你有個好的網頁設計師能搭配開發，你可能還可以不用學 CSS，但其他技術可不能偷懶。

**10\. MVC 的架構真的適用網頁開發嗎？**

MVC 是一種設計樣式(Design Pattern)，不僅僅可用在 Web 領域，還有其他很多領域都適合用 MVC 來開發。若專講 ASP.NET MVC 就真的是為了 Web 應用程式開發而設計出來的 MVC 框架，非常適合用來開發 Web 應用程式，至於是否真的適合你用就要等你實際動手寫、動腦想、跌幾次跤就會有深刻的體會了，我自己的經驗是「**非常適合**」。

**11\. ASP.NET Web Form 會被 ASP.NET MVC 取代嗎？**

綜觀的來看，你想想之前 ASP 轉 ASP.NET 的時代，至今已經十年，你覺得 ASP 被取代了嗎？還是有一堆線上的網站依然是用 ASP 開發而成的，而且還運作的不錯，所以，講「取代」是不切實際的。

微觀的來看，一間公司內如果決心轉向 ASP.NET，應該也會陸續擺脫 ASP 的牽連吧？同時維持多項不相容的技術長久來看成本很高，所以一定會先兩者並行，然後再徹底擺脫舊技術。

由於 ASP.NET Web Form 與 ASP.NET MVC 雖然在開發架構上有很大的不同，但彼此共用的技術非常多，例如：ASP.NET Application Life Cycle, ASP.NET Provider Model (Membership, Profile, SiteMap, …), Web Caching, Session, Authentication, … 等等。所以我認為兩者平行存在的時間可能會比 ASP 與 ASP.NET 平行存在的時間還更久，不過這只是「縱觀的來看」。

如果微觀的來看，如果你的公司決心將技術領域轉向 ASP.NET MVC 而你不願意轉型話，那麼你在這間公司的價值也會不斷降低，因為兩者開發模式差別甚大，在一間公司或同一個開發團隊中長時間維持兩種完全不同的開發模式不太明智，也許短時間內必須維護舊有系統一段時間，但時日一久必定整合為全新的開發模式，但此前提是「如果一間公司決心將技術領域轉向 ASP.NET MVC 開發框架」。

若已將現有 ASP.NET Web Form 程式全數轉移至 ASP.NET MVC 的話，也著實沒有將這兩個開發框架並存的必要性，我個人認為將開發框架從 ASP.NET Web Form 轉到 ASP.NET MVC 的過程是**不可逆**的，也就是當你愛上了 ASP.NET MVC 你就不會再用 ASP.NET Web Form 來開發 Web 應用程式，那種魅力與實際獲得的效益是不言可喻的。

所以這個問題如果要用一句話簡單回應，我會說：「老兵不死，只是逐漸凋零」

**12\. ASP.NET MVC 的除錯方式是否跟 ASP.NET Web Form 所有不同？**

只有些許不同，由於 ASP.NET MVC 不使用 ASP.NET Web Form 的 ASP.NET Page Handler 處理網頁，所以內建的 [ASP.NET 追蹤](http://msdn.microsoft.com/zh-tw/library/bb386420.aspx) ( [ASP.NET Tracing](http://msdn.microsoft.com/en-us/library/bb386420.aspx) ) 機制無法使用，必須改採 .NET 標準的追蹤機制，請參考 [Trace 類別](http://msdn.microsoft.com/zh-tw/library/system.diagnostics.trace.aspx) 與 [Debug 類別](http://msdn.microsoft.com/zh-tw/library/system.diagnostics.debug.aspx) 等相關資訊。

其他在 Visual Studio 中的的偵錯方式如 中斷點、監看式、附加程序、…等常見的偵錯方式完全一模一樣，並無他異。

* * *

各位如果還有更多關於 ASP.NET MVC 的疑問，歡迎在此留言，等累積一段時間後我會整批回覆大家的疑問，謝謝。

* * *

**相關連結**

-   [Model–view–controller - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)
-   [Cutting Edge - Comparing Web Forms And ASP.NET MVC](http://msdn.microsoft.com/en-us/magazine/dd942833.aspx) ( MSDN Magazine )
-   [ASP.NET MVC - 建置沒有 Web Form 的 Web 應用程式](http://msdn.microsoft.com/zh-tw/magazine/cc337884.aspx) \[ [英文原文版](http://msdn.microsoft.com/en-us/magazine/cc337884.aspx) \]
-   [ASP.NET MVC技術定位與抉擇-DotNet開發聖殿](https://web.archive.org/web/20210422213020/http://blog.sina.com.tw/dotnet/article.php?pbgid=4907&entryid=584393)
-   [MVC - ScottGu's Blog](https://weblogs.asp.net/scottgu/Tags/MVC)
