ASP.NET MVC 是什麼?能吃嗎?

「a... 怎麼看起來好像又回到了 ASP 時代?」
「a... 這個好複雜哦,看不懂捏...」
我想,這是初次看 ASP.NET MVC Framework 的第一印象吧,因為我第一次看到時也有這樣的疑問。

「a... 怎麼看起來好像又回到了 ASP 時代?」
「a... 這個好複雜哦,看不懂捏...」
我想,這是初次看 ASP.NET MVC Framework 的第一印象吧,因為我第一次看到時也有這樣的疑問。不過深入了解後,其實它真的是必要之惡,因為 MVC 中的 View,是要根據 Model 來自由變化的,如果還一昧的使用原有的 ASP.NET 控制項模型的話,ASP.NET 開發人員可能會哭出來吧 ...

ASP.NET 最被其他平台開發者詬病的其中一個原因,就是沒有一個完善的 MVC Pattern 開發模式,像是 JSP, Ruby on Rails, PHP 這些技術都有,但似乎微軟除了 MFC 中的 Document/View 架構(其實這也是一個偽 MVC ...)以外,較少有支援 MVC 的開發模型(不過還是有啦,像是 Composite UI Framework, Enterprise Library 等等),而 Scott Guthrie (ASP.NET 的 Product Manager) 似乎也吃了秤陀鐵了心一般,在 ASP.NET 3.5 出來之前,就開始研發 ASP.NET 上的 MVC Pattern,也就是 ASP.NET MVC Framework。

那這個東西除了是 MVC Pattern 的體現,其實它還可以融合許多的微軟技術,像是:

  • LINQ to SQL/ADO.NET Entity Framework,作為 Model。
  • 泛型化的 ViewPage 收納器,可容納各種類型的 View。
  • ASP.NET Routing 技術,讓 URL 可以達成 REST 特性,也可以精確的導向 Controller。
  • Controller 可以分門別類,處理各種不同的動作,也可以處理不同的 HTTP Request。

不過說實在的,這個東西真的不是 ASP.NET 初學者玩的起來的,它至少要求使用者:

  • 對 Web 開發與 HTTP 模型有一定程度的了解,若要量化,就是至少 2-3 年的開發經驗。
  • 對 HTML, HTTP 與 URL 協定有一定程度的了解。
  • 熟悉 MVC Pattern。
  • 熟悉 Model 設計方法 (LINQ to SQL/ADO.NET Entity Framework)。
  • 熟悉 ASP.NET Routing 的功能。

若能夠靈活的操作它,ASP.NET MVC 的開發其實會比 ASP.NET 來的更快,除了它精確的分離了 MVC 各個區塊外,由於 View 的高彈性,不必再辛苦的使用 GridView 或是 DataList 去組裝使用者介面,而是由開發人員自己決定要怎麼顯示,其實這也是 View 的精神所在,例如:

<%@ Control Language="C#" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewUserControl<OxiteModel>" %>
<%@ Import Namespace="Oxite.Mvc.Extensions" %>

<%
if (Model.User != null && Model.User.IsAuthenticated)
{
%>
   <%
       = string.Format(Model.Localize("WelcomeUserMessageFormat", "Welcome, {0}!"),
         string.Format("<span class=\"username\">{0}</span>", 
                 Html.Encode(Model.User.DisplayName)))
   %>
<span class="logout">&laquo; 
   <%=Html.Link(Model.Localize("Logout"), Url.SignOut())%>
&raquo;</span>
<%
}
else
{
%>
<span class="login">&laquo; 
<%
   =Html.Link(Model.Localize("Login"), Url.SignIn(Request.Url.PathAndQuery))
%>
&raquo;</span>

<%
}
%>

上面這一段是 Oxite (一個以 ASP.NET MVC Framework 開發的 blog engine project) 中的 LoginUserControl.ascx (View) 的頁面程式,如果寫過 ASP 的人可能會發現,它和 ASP 幾乎一模一樣,不過仔細看一下,它只有操作顯示資料的部份,這是因為控制資料的部份是放在 Controller 中,同時 Model 也是由 Controller 來取得,再交給 View 的,而 View 這樣的設計方法,也大大的強化了它的彈性,因此我才會說 ASP.NET MVC 的 View,比 ASP.NET 原有的設計在彈性上強化太多了。

不過大家也不要誤會,ASP.NET MVC 只是另一個設計 ASP.NET 應用程式的方法,它不會,也沒有任何理由要取代現有的 ASP.NET Web Form 開發模式,兩者是並行且不衝突的。

另外一個重點是,ASP.NET MVC 架構有釋出它的原始碼,以 Microsoft Public License (MS-PL) 授權模式釋出,對它有興趣的可以在微軟的官方下載網站 (http://www.microsoft.com/downloads) 上找到它。

Reference:
http://weblogs.asp.net/scottgu/archive/2009/04/01/asp-net-mvc-1-0.aspx 
http://videos.visitmix.com/MIX09/T50F 
http://msdn.microsoft.com/en-us/library/dd394709.aspx