由於之前主要是作WebFrom開發,對MVC開發並無太深刻的瞭解。自歷來到創新工場的新團隊後,用的技術都是本身之前沒有接觸過的,好比:MVC 和EF還有就是WCF,壓力一直很大。在不少問題都是不清楚的狀況下,問周圍的人,別人也只是給本身講一個大概。並且前兩天由於問了一個比較細的問題,還被別人的一句話打擊。「我只能告訴你方法,你還期望我手把手的交給你呀,不會你得本身學呀。。。」。沒辦法只能本身找時間在下面找一些資料學習。css
在初步瞭解MVC後,發現不少人對於MVC和三層架構開發概念上會有很大的混淆,因此把這兩天的學習筆記整理一下,分享給本身的同窗們。同時也作一個小Demo,讓沒有接觸過MVC開發的同窗,能對MVC有一個簡單的瞭解。html
一,MVC和三層架構的區別程序員
①什麼是三層架構?數據庫
在學校的時候,和同窗或者老師一塊兒討論MVC的時候,別人可能會說,「不就是三層架構嘛!實體層(Model),用來建立對象的實體;業務邏輯層(BLL),用來處理複雜的數據間的關係或者是業務間的關係;數據庫訪問層(DAL),用來用來訪問數據庫的;固然還會有,View(視圖層),用來展現數據;」其實本身雖然知道不是這樣,可是本身也僅僅是瞭解一點點,也解釋不清楚,因此也就算了。(具體的三層架構之間的操做的關係能夠看我之前的博客【ASP.NET開發】.NET三層架構簡單解析)。設計模式
它們之間互相操做的關係,基本的示意圖以下:瀏覽器
還記的暑假在鄭州找實習工做的時候,被別人問過一個n層架構的概念,當時就懵了,尼瑪的壓根就沒據說過啊!不事後來查詢資料知道,所謂的n曾架構就是根據系統的須要把業務邏輯層(BLL)或者數據庫訪問層(DAL)再抽象成幾個層次(具體的就是再抽象成類),便於邏輯的處理和代碼模塊的維護。其基本原理仍是基於三層架構。服務器
②什麼是MVC呢?網絡
MVC實際上是軟件架構的一種模式,也就是咱們常常說的設計模式。其中主要包括三個模塊,就是如MVC名字所顯示的那樣:模型(Model),視圖(View),控制器(Controller);架構
其中這裏的模型(Model)和視圖(View )是徹底區別於三層架構中的模型(Model)和視圖(View)的。框架
1)MVC中的模型(Model)指的是數據模型,用於封裝與應用程序的業務邏輯相關的數據,除此以外還能夠封裝數據的處理方法(至關於業務邏輯)。這是徹底區別於三層架構的模型層(Model)的。
MVC中模型(Model)的特色:
①有對數據直接訪問的權利,如:對數據庫的訪問;
②模型(Model)「不依賴」視圖(View)和控制器(Controller),即模型(Model)不關心它會被如何顯示或者如何被操做;
③模型(Model)中數據的變化通常會經過一種刷新機制被「公佈」;
④爲了實現③中的「機制」用於監視此模型的視圖必須事先在此模型上註冊。從而,視圖能夠了解在數據模型上發生的改變。
2)視圖(View),這裏的視圖基本跟三層中的視圖同樣,都是爲了顯示數據,沒有程序上的邏輯。爲了實現視圖上數據的刷新,視圖(View)須要訪問它監視的模型(Model),因此應該事先在被它監視的數據那裏進行註冊。
3)控制器(Controller),這個概念是在三層中不存在的概念。它主要起到不一樣層面的組織做用,用於控制應用程序的流程。主要處理事件並做出相應。「事件」主要包括:用戶的行爲和數據的改變。
以上就是關於三層架構和MVC在概念上的區別。
二,WebForm網站和MVC網站運行機制的區別
①WebForm網站的運行機制
好比說咱們如今要訪問一個WebForm站點:www.google.com.hk/Default.aspx(僅僅是示例)。咱們的瀏覽器和服務器都是作了哪些動做呢?
1)首先瀏覽器會向目的服務器發送請求報文。
配置過IIS的都知道,網站掛載在服務器上,咱們是經過訪問虛擬目錄的方式訪問網站的。這時候目的主機的IIS接收的是訪問該虛擬目錄下Default.aspx文件的請求;(固然這也是一個很是複雜的過程,包括請求DNS服務器,找到目的主機IP,根據IP地址訪問目的主機。複雜的網絡過程就不敘述,有興趣的本身找資料學習);
2)服務器端的IIS軟件接收到請求後,把請求交給.NET FramWork進行處理;
3).NET FramWork會建立Default_aspx類的對象,也就是咱們所說的頁面對象。(在WebFrom網站建立完,而且編譯後Default.aspx會被編譯成Default_aspx類)
到如今的整個過程都仍是Http請求,IIS的內部機制會去實現一個IHttphandler的接口,其中該接口實現一個ProcessRequestfang方法
MSDN是這樣解釋的
該ProcessRequest()方法會去調用對應頁面的Page_Load() 方法
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 //處理的業務邏輯或者是訪問數據庫的代碼 4 //要輸出的Html或者其它內容 5 }
4)返回給瀏覽器(包括Html,CSS,Js等等)
流程示意圖以下:
②MVC網站的運行機制
還好比說咱們如今要訪問一個MVC站點:www.google.com.hk/FirstPage/Default(僅僅是示例)。咱們的瀏覽器和服務器又作了哪些動做呢?
1)瀏覽器向服務器發送Request請求報文(FirstPage/Default)
2)服務器端的IIS相應Request請求
3).NET FramWork根據路由配置,解析URL,並建立FirstPage類的對象,並調用相應的Default方法
1 public ActionResult Default() 2 { 3 4 return View();//返回給視圖 5 }
4)而後會訪問視圖文件夾下的Default.cshtml,返回給瀏覽器(其中包括html,css,js等等)
流程的示意圖以下:
這只是一個比較簡單的運行過程。其實在這過程當中發生了不少事情,好比說:執行Global.asax中的Application_Start()方法來完成一些初始化的工做等等,會在之後的文章中繼續解析。
以上就是WebForm網站和MVC網站運行機制的區別。
那麼到底使用MVC的優勢比WebForm到底有哪些優勢呢?
①最重要的就是.NET程序員在開發的時候不再會使用那些被不少人詬病的微軟封裝的控件了。
②MVC設計模式下降了模型(Model,業務和數據)和視圖的耦合關係。包括咱們在開發WebForm網站使用三層架構的思想也是爲了下降數據和視圖的耦合等;
③能夠複用視圖,也就是說一樣的數據可使用不一樣的視圖以不一樣的圖標展現出來。
-------------------------------------------------------理論到此結束---------------------------------------------------------------
經常使用的WebForm開發方式就不舉例了,我下邊主要演示一個基本的MVC程序的建立和運行過程。
要建立MVC程序VS確定是必不可少的,個人開發環境是VS2013,你們請酌情考慮本身的VS版本。
①首先的打開「文件」→「新建項目」,在左側的項目欄選擇「Visual C#」→「Web」,在右邊就能夠看到有「ASP.NET Web窗體應用程序」和「ASP.NET MVC 4 Web應用程序」以下圖:
②由於要建立MVC程序就選擇點擊第二個選項而後會看到項目模板,默認的是選擇「Internet應用程序」,若是選擇默認的話,就會默認的建立一個具備基本功能的站點。咱們這裏選擇「基本」,VS只會建立包含基本框架簡的模板
③建立完之後咱們會在解決方案下看到代碼的樹狀結構,其中包含Models,Views和Controllers三個文件夾
④咱們首先建立實體對象Model,在Models文件夾下建立一個Child類,並聲明屬性和初始化
1 public class Child 2 { 3 //編號 4 private int id; 5 6 7 public int Id 8 { 9 get { return id; } 10 set { id = value; } 11 } 12 13 //姓名 14 private string strName; 15 16 public string StrName 17 { 18 get { return strName; } 19 set { strName = value; } 20 } 21 22 }
⑤在Controllers文件夾上右鍵,「添加」,會看到有「控制器」的選項,以下圖:
點擊"控制器"後會出現一個「添加控制器」窗體,在控制器名稱中」Default1Controller「中」Default1「是默認選中的,咱們修改其名稱爲」HomeController「,
注意:這裏的」Default1Controller「中的」*Controller「是必須保留的,主要是由於MVC框架有一個」約定大於配置「的規則
單擊」添加「添加控制器,默認生成的控制器代碼,以下:
1 //默認生成的控制器代碼 2 public class HomeController : Controller 3 { 4 // 5 // GET: /Home/ 6 7 //包含一個Action方法 8 public ActionResult Index() 9 { 10 //返回給視圖 11 return View(); 12 } 13 14 }
⑥而後咱們建立一個集合來初始化在Models中建立的Child類的屬性值
1 #region 初始化數據集合 +List InitData() 2 /// <summary> 3 /// 初始化數據集合 4 /// </summary> 5 /// <returns></returns> 6 public List<Models.Child> InitData() 7 { 8 9 List<Models.Child> list = new List<Models.Child>() 10 { 11 new Child(){Id=1,StrName="你好啊!"}, 12 new Child(){Id=2,StrName="很差啊!"} 13 }; 14 15 return list; 16 } 17 18 #endregion
而後開始編寫Action方法,即」ActionResult Index()「方法,
1 /// <summary> 2 /// Action方法(至關於MVC設計模式的Model) 3 /// </summary> 4 /// <returns></returns> 5 6 public ActionResult Index() 7 { 8 //能夠處理當前業務(你好比讀取數據庫,判斷等) 9 StringBuilder strBuilder = new StringBuilder(); 10 //建立數據集合,獲取數據 11 List<Models.Child> list = InitData(); 12 //遍歷集合獲取生成的Html代碼 13 list.ForEach(d => 14 { 15 strBuilder.AppendLine("<div>" + d.Id.ToString() + "</div>"); 16 }); 17 18 //使用ViewBag傳輸數據給同名的Indexcshtml視圖 19 //ViewBag是一個dynamic類型的集合,能夠動態添加任意類型的任意名稱和屬性 20 ViewBag.HtmlStrBuilder = strBuilder.ToString(); 21 //加載同名視圖Index.cshtml 22 return View(); 23 }
在其中咱們使用ViewBag把數據傳輸給同名的Views文件夾下的同名視圖。
⑦建立視圖接收數據,上面代碼的Index方法上右鍵,會出現」添加視圖「,以下圖
以後會在Views文件夾下,生成一個Home文件夾,Home文件夾下面會有一個Index.cshtml文件(這個就是視圖文件)
⑧視圖接收數據
1 <html> 2 <head> 3 <meta name="viewport" content="width=device-width" /> 4 <title>Index</title> 5 </head> 6 <body> 7 <div> 8 <!---------至關於把Action方法中保存的內容輸出---------> 9 @Html.Raw( @ViewBag.HtmlStrBuilder) 10 </div> 11 </body> 12 </html>
到這裏基本上就完成了一個MVC程序的建立,咱們運行程序,結果以下:
注意:由於MVC的運行機制跟WebForm不同,因此瀏覽的方式也不同。咱們能夠直接在Views文件夾上右鍵,選擇在瀏覽器中查看就能夠預覽到結果。
-----------------------------------------分割線-------------------------------------------
到這裏,關於ASP.NET WebForm和Mvc開發的區別和基本MVC程序的建立過程已經完成。
下次我會作的是使用EF(Entity FramWork),來操做數據庫(拋開WebForm中的ADO.NET),實現一個MVC小網站程序的建立。請你們繼續關注!
若是在文章中出現錯誤,歡迎你們留言指正。我會虛心接受你們的意見。