MVC工作原理

2021-09-06 04:27:18 字數 3756 閱讀 8481

mvc(model-view-controller,模型—檢視—控制器模式)用於表示一種軟體架構模式。它把軟體系統分為三個基本部分:模型(model),檢視(view)和控制器(controller)。

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

我們先來看一下普通的webform模式下,我們請求乙個例如的url,那麼我們的webform程式會到**根目錄下去尋找blog目錄下的index.aspx檔案,然後由index.aspx頁面的codebehind檔案(.cs檔案)進行邏輯處理,其中或許也包括到資料庫去取出資料(其中的經過怎樣的bll到dal這裡就不談了),然後再由index.aspx頁面來呈現給使用者。簡單的示意圖如下所示:

也就是乙個url請求的是在伺服器與該url對應路徑上的物理檔案(aspx檔案或其他),然後由該檔案來處理這個請求並返回結果給客戶端。

但是,對於mvc模式,這是怎樣的乙個過程呢?

我們先來建乙個asp.net mvc的專案吧。vs2008預設是沒有asp.net mvc的專案模板的,首先我們需要到

在中文版vs 08中安裝mvc

這篇文章設定一下。

建立乙個asp.net mvc專案後,預設的專案大概如下圖:

我們可以看到專案中有幾個資料夾的命名和mvc(model-view-controller,模型—檢視—控制器模式)是對應的。然後我們執行一下專案看看:

我們注意到位址列的url是 home/index,如果按照我們前面說的webform的模式的話,我們應該可以在我們的專案的根目錄下找到home目錄,然後home目錄下有個index的檔案,但是我們並不能在根目錄下找到home這個目錄。不過還是讓我們在views目錄下找到了views/home/index.aspx檔案,我們輸入這個位址執行看看:

oh,no!路徑是對的,檔案也存在,但為什麼會是404,說找不到檔案呢?如果不是直接訪問存在的物理檔案,那麼mvc又是怎樣工作的呢?

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

在mvc中,客戶端的所請求的url是被對映到相應的controller去,然後由controller來處理業務邏輯,或許要從model中取資料,然後再由controller選擇合適的view返回給客戶端。再說回前面我們執行的asp.net mvc程式訪問的http://localhost:2176/home/index這個url,它訪問的其實是homecontroller中的index這個action,見下圖:

其中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檔案去看一下:

我們可以看到這裡定義了乙個名為"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//.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檔案,內容如下:

也就是訪問views目錄下的所有的檔案都會由system.web.httpnotfoundhandler來處理,所以請不要將資源檔案(css、js、等)放到views目錄中。如果你確實要放到views目錄下的話,請修改views/web.config檔案。

MVC工作原理

一 mvc簡介 書面解釋 mvc全名是model view controller,是模型 檢視 控制器的縮寫,一種軟體設計典範,是一種業務邏輯和資料顯示分離的方法組織 將業務邏輯被聚集的乙個部件裡。在介面和使用者圍繞資料的互動能被改進和個性化定製的同時而不需要重新編寫業務邏輯。學習mvc的目的 快速...

MVC 的工作原理

使用者向伺服器傳送請求,請求被 springmvc 前端控制器dispatchservlet捕獲 dispatchservlet 根據獲得 handler 選擇乙個合適的 handleradapter介面卡處理 handler 對資料處理完成以後將返回乙個modelandview物件給 dispat...

MVC中RenderBody的工作原理

html.partial logonpartial renderbody 現在,我們開啟views home下的index.cshtml 檔案,大致包含以下內容 to learn more about asp.net mvc visit 可是,從這個檔案,看不到是否引用了layout布局檔案,這只是...