天天看點

[轉]ASP.NET MVC 入門1、簡介

什麼是MVC模式

MVC(Model-View-Controller,模型—視圖—控制器模式)用于表示一種軟體架構模式。它把軟體系統分為三個基本部分:模型(Model),視圖(View)和控制器(Controller)。

那麼MVC模式和我們熟悉的WebForm模式有什麼不同呢?他的各個部分又是怎樣分工的呢?

我們先來看一下普通的WebForm模式下,我們請求一個例如​​http://www.51mvc.com/blog/index.aspx​​的URL,那麼我們的WebForm程式會到網站根目錄下去尋找blog目錄下的index.aspx檔案,然後由index.aspx頁面的CodeBehind檔案(.CS檔案)進行邏輯處理,其中或許也包括到資料庫去取出資料(其中的經過怎樣的BLL到DAL這裡就不談了),然後再由index.aspx頁面來呈現給使用者。簡單的示意圖如下所示:

​​

[轉]ASP.NET MVC 入門1、簡介

也就是一個URL請求的是在伺服器與該URL對應路徑上的實體檔案(ASPX檔案或其他),然後由該檔案來處理這個請求并傳回結果給用戶端。

但是,對于MVC模式,這是怎樣的一個過程呢?

我們先來建一個ASP.NET MVC的項目吧。VS2008預設是沒有ASP.NET MVC的項目模闆的,首先我們需要到​​http://www.microsoft.com/downloads/details.aspx?FamilyId=A24D1E00-CD35-4F66-BAA0-2362BDDE0766&displaylang=en​​去下載下傳最新的ASP.NET MVC的安裝程式,目前最新版本的Microsoft ASP.NET MVC Beta(10/15/2008)。下載下傳安裝完後,我們可以在建立項目那裡找到ASP.NET MVC的項目:

[轉]ASP.NET MVC 入門1、簡介

​​ 

注:如果你的是中文版的VS,安裝完後可能會出現找不到這個模闆的現象,你可以參考​​在中文版VS 08中安裝MVC​​這篇文章設定一下。

建立一個ASP.NET MVC項目後,預設的項目大概如下圖:

[轉]ASP.NET MVC 入門1、簡介

我們可以看到項目中有幾個檔案夾的命名和MVC(Model-View-Controller,模型—視圖—控制器模式)是對應的。然後我們運作一下項目看看:

[轉]ASP.NET MVC 入門1、簡介

我們注意到位址欄的URL是 Home/Index,如果按照我們前面說的WebForm的模式的話,我們應該可以在我們的項目的根目錄下找到Home目錄,然後Home目錄下有個Index的檔案,但是我們并不能在根目錄下找到Home這個目錄。不過還是讓我們在Views目錄下找到了Views/Home/Index.aspx檔案,我們輸入這個位址運作看看:

[轉]ASP.NET MVC 入門1、簡介

Oh,No!路徑是對的,檔案也存在,但為什麼會是404,說找不到檔案呢?如果不是直接通路存在的實體檔案,那麼MVC又是怎樣工作的呢?

原來啊,MVC模式的工作過程是這樣的:

[轉]ASP.NET MVC 入門1、簡介

在MVC中,用戶端的所請求的URL是被映射到相應的Controller去,然後由Controller來處理業務邏輯,或許要從Model中取資料,然後再由Controller選擇合适的View傳回給用戶端。再說回前面我們運作的ASP.NET MVC程式通路的​​http://localhost:2176/Home/Index​​這個URL,它通路的其實是HomeController中的Index這個Action,見下圖:

[轉]ASP.NET MVC 入門1、簡介

其中public ActionResult Index()這個方法稱為Controller的Action,他傳回的是ActionResult的類型。一個Controller可以有很多個Action。

那麼一個URL是怎樣被定位到Controller中來的呢?我們先來看一下web.config檔案,在web.config檔案的httpModules配置節中,我們可以看到一個UrlRoutingModule:

<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

就是這個UrlRoutingModule來把URL定位到Controller中去的。而對于URL會被路由到哪一個Controller中去,這些我們是完全可以自己定義的。我們到Global.asax檔案去看一下:

[轉]ASP.NET MVC 入門1、簡介

我們可以看到這裡定義了一個名為"Default"的Route,還定義了預設的參數。預設參數的意義在于,當我們通路例如​​http://localhost:2176/​​​的URL的時候,他會将不存在的參數用預設的參數補上,也就是相當于通路​​http://localhost:2176/Home/Index​​一樣。

注意:我們知道在IIS中,我們通路網站的根目錄的時候,如果我們不指定要通路的路徑,IIS會自己根據在IIS中設定的預設文檔去通路。例如我們通路​​http://localhost:2176/​​​這個URL的時候,IIS會去尋找網站根目錄下的Default.aspx檔案(假設我們設定了IIS的預設文檔為Default.aspx)。而在ASP.NET MVC中對于類似​​http://localhost:2176/​​​這樣的網站根目錄的路徑,并不會經過Route的處理,是以我們看到我們建立的ASP.NET MVC程式的根目錄下有個Default.aspx檔案,該檔案就是用于處理前面的通路根目錄的情況的。請不要删除該檔案。它會将​​http://localhost:2176/Default.aspx​​交由ASP.NET MVC來處理,具體請看Default.aspx.cs檔案。

我們知道了一個URL是怎樣定位到相應的Controller中去的了,那麼View又是怎麼被傳回給用戶端的呢?我們從前面的截圖中看到,Controller中的Action方法中有個return View()的方法。預設情況下它會傳回與Action同名的view.在ASP.NET MVC預設的視圖引擎(WebFormViewEngine)下,view是按如下路徑通路的:

/Views/{Controller}/{Action}.aspx

也就是說對于​​http://localhost:2176/Home/Index​​這個路徑,在預設情況下,在Index這個Action中用return View()來傳回view的時候,會去尋找/Views/Home/Index.aspx檔案,如果找不到這個檔案,就會去Share目錄中尋找:/Views/Share/Index.aspx,如果都找不到,就會抛出找不到View的異常。return View("lulu.aspx")來指定要傳回哪一個view:/Views/Home/lulu.aspx。

那麼為什麼前面我們直接通路Views/Home/Index.aspx這裡檔案的時候會出現404錯誤,說找不到檔案呢?因為在MVC中,是不建議直接去通路View的,是以我們建立的ASP.NET MVC程式在預設情況下就在Views目錄下加了一個web.config檔案,内容如下:

[轉]ASP.NET MVC 入門1、簡介

也就是通路Views目錄下的所有的檔案都會由System.Web.HttpNotFoundHandler來處理,是以請不要将資源檔案(CSS、JS、圖檔等)放到Views目錄中。如果你确實要放到Views目錄下的話,請修改Views/web.config檔案。

上一篇: ASP.NET