標籤:
1. 簡介 ? 定義?什麼是MVC
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟體設計典範,用一種商務邏輯、資料、介面顯示分離的方法組織代碼,將商務邏輯聚集到一個組件裡面,在改進和個人化定製介面及使用者互動的同時,不需要重新編寫商務邏輯。MVC被獨特的發展起來用於映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化使用者介面的結構中。
? VC模式和我們熟悉的WebForm模式
看上面的這兩幅圖,上面的那一幅圖是web請求方式,下面的那個是mvc模式,我們可以看出,第一種web方式用戶端向瀏覽器發送一個請求:比如:www.itcast.cn/index.aspx;瀏覽器向伺服器發送報文請求,伺服器端的framework建立一個頁面的對象,將輸入的資料進行處理後輸出html或其他的內容,最後將處理後的資料渲染成為html或者js或者css的形式返回給用戶端瀏覽器進行顯示。傳統web開發是輸入一個網址,請求的是一個頁面類
而第二種方式是MVC方式,同樣是向伺服器發送請求比如www.itcast.cn/news/index,不同於傳統的web形式,在伺服器framework中,根據路由配置,將傳過來的url進行解析,建立news對象,並且調用對象的index方法,在方法中進行資料的處理,並且將結果儲存咋視圖中,最後將結果渲染為html或者js或者css形式以視圖的形式返回給用戶端瀏覽器。而mvc是請求頁面類中的一個方法,之後將資料轉送到視圖中進行顯示。
看下面的這兩種圖更為清晰:
傳統web形式:
Mvc模式:
2. 內部詳解 ? 程式的訪問路徑
從上面的圖上我們可以看出,在MVC中,用戶端的所請求的URL是被映射到相應的Controller去,然後由Controller來處理商務邏輯,或許要從Model中取資料,然後再由Controller選擇合適的View返回給用戶端。
建立一個小的程式:建立解決方案,之後添加一個控制器,裡面的代碼如下:
<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using MVCBlog.Models;using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MVCBlog.Controllers{ //1.控制器類(繼承了Controller) public class HomeController : Controller { //建立一個資料集合(偽資料) #region 0.1初始化資料集合+ void InitData() /// <summary> /// 初始化資料集合 /// </summary> public List<Models.Dog> InitData() { List<Models.Dog> list = new List<Models.Dog>() { new Dog(){ID=1,Name="小樣~~"}, new Dog(){ID=2,Name="小樣2~~"}, new Dog(){ID=3,Name="小樣3~~"}, new Dog(){ID=4,Name="小樣4~~"} }; return list; } #endregion //2.Action方法(可以看成MVC設計模式的Model) public ActionResult Index() { //定義一個容器,並且設計容量 System.Text.StringBuilder sbHtml = new System.Text.StringBuilder(4000); // 2.1讀取當前的業務,比如讀取資料庫、判斷等等) //2.1建立一個資料集合,擷取當前資料 List<Models.Dog> list = InitData(); //2.1.1遍曆集合,產生html代碼,並且存入到sbHtml中 list.ForEach(d => { sbHtml.AppendLine("<div>" + d.ToString() + "</div>"); }); //使用viewBag傳遞資料給同名的Index.cshtml //viewBag是一個dynamic類型集合,可以動態添加任何類型的任意名稱的屬性和值 ViewBag.Htmlstr = sbHtml.ToString(); //2.3載入同名視圖Index.cshtml return View(); } }}</strong></span>
之後在Models裡面添加一個dog類,代碼如下:
<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace MVCBlog.Models{ public class Dog { public int ID { get;set; } public string Name { get; set; } public override string ToString() { return "ID=" + this.ID + ",Name=" + this.Name; } }}</strong></span>
在index方法上滑鼠右擊添加視圖,視圖的代碼如下:
<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport" content="width=device-width" /> <title>Index</title></head><body> @ViewBag.HtmlStr</body></html></strong></span>
直接運行即可:效果如:
我們看到無論是訪問前者的地址還是後者的地址,內容是一樣的,說明預設情況下訪問的就是http://localhost:9711/Home/index。
我們注意到地址欄的URL是 Home/Index,如果按照我們前面說的WebForm的模式的話,我們應該可以在我們的項目的根目錄下找到Home目錄,然後Home目錄下有個Index的檔案,但是我們並不能在根目錄下找到Home這個目錄。不過還是讓我們在Views目錄下找到了Views/Home/Index.aspx檔案,我們輸入這個地址運行看看:
為什麼會這樣呢,路徑是正確的,但是顯示不出來,怎麼回事呢?我們來解析一下吧。
? MVC運行機制 為什麼輸入路徑看似正確卻出錯呢?
前面我們看到即使輸入的路徑是正確的,但是還是出錯了,怎麼回事呢?
我們開啟Views檔案夾的設定檔,其實這個檔案夾下還有一個設定檔的,
這就解決了為什麼前面我們直接存取Views/Home/Index.aspx這裡檔案的時候會出現404錯誤,說找不到檔案呢?因為在MVC中,是不建議直接去訪問View的,所以當我們訪問時,也就是訪問Views目錄下的所有的檔案都會由System.Web.HttpNotFoundHandler因此我們不要將資源檔(CSS、JS、圖片等)放到Views目錄中。
為什麼前兩種的輸入都能出來最後結果呢?
在MVC中,用戶端的所請求的URL是被映射到相應的Controller去,然後由Controller來處理商務邏輯,或許要從Model中取資料,然後再由Controller選擇合適的View返回給用戶端。
當我們啟動並執行ASP.NET MVC程式訪問的這個URL,它其實訪問的是HomeController中的Index這個Action。
那麼為什麼第一個地址也是可以訪問啊,http://localhost:9711,原因在於MVC的路由機制,我們看看路由的配置:
我們可以看到這裡定義了一個名為"Default"的Route,還定義了預設的參數。預設參數的意義在於,當我們訪問例如http://localhost:9711的URL的時候,他會將不存在的參數用預設的參數補上,也就是相當於訪問http://localhost:9711/Home/Index一樣。故而會出現上面的兩種相同的結果。
? MVC核心組件
在MVC設計模式中,Model是指要處理的商務邏輯和資料操作;View視圖主要是指的跟使用者打交道並且顯示給使用者看的;Controller看成是Model和View的橋樑。
第一個Controller也即是控制器
很多人在問Model在哪裡,是不是就是建立出來的Models檔案夾下的呢,其實/Home/action方法可以看成是MVC設計模式的Model,因為這個方法會根據建立在Models中的類或者一些資料進行操作。
第二個是Models
學過三層可能不會陌生,三層中的實體就是這個東東,那他們一樣嗎?有相同的,也有區別,我們不僅僅可以定義實體,同樣我們可以建立資料模型,也即是EF(EntityFramework);也即是ORM(對象關係映射架構/資料持久化架構)根據實體物件操作資料表中資料的一種物件導向的操作架構,底層也是調用ADO.Net.
第三個是Views
用戶端瀏覽器發送的請求經過Controller的中方法index處理後由Controller選擇合適的View返回給用戶端。主要是呈現給使用者看的。
3. 總結
這裡只是自己初步學習的理解,這裡主要講述的是理論,下篇會講解一些應用還有其他的知識。請繼續關注~
MVC基礎學習—理論篇