終於決定寫一個系列的文章了,最開始實際上是準備寫一下WPF的,由於我這兩年一直在作WPF,對WPF的喜好天然是無以言表。可是因爲我所在的地區對WPF的普及不是很普遍,因此,被迫又開始作起來web,可是我又不想在傳統的web froms上工做。固而開始研究MVC。在看完了一本入門級的MVC書籍以後,我又轉而開始愛上MVC。它輕量,簡潔,擴展性和對html的深度控制這些特性會打破ASP.NET的開發模式。可是,也不是說MVC就能解決一切問題。它就是全部的編程模式中最好的,它也會有它的一些不足。但是咱們想一想,世界上有什麼東西又會是完美的呢?對於咱們程序員而言,語言,IDE就是咱們工具。只要用着順手,能寫出高效的代碼就好了。管它誰人說那種語言好仍是很差呢。廢話說得有點多,我更新這個系列的文章是爲了對本身學習的一個總結,而且分享給尚在學習階段的兄弟。在園子裏寫得比我好的大牛不少。因此,歡迎指正錯誤與不足。html
既然這是介紹MVC,那咱們就來講說什麼是MVC。傳統的MVC實際上是一種理念。旨在分離關注點。及把咱們的系統按照不一樣的關注點分離開來。這樣系統以各自的關注點分離開來。整個系統的可維護性,擴展性都會大大的提升。整個系統的層次結構也會更加的清晰。咱們這裏所談的MVC實際上是ASP.NET MVC。ASP.NET MVC實際上是一種框架。以ASP.NET爲平臺的框架,也就是說,其實它其實仍是運行在ASP.NET運行時上的,微軟根據MVC的理念,在ASP.NET上封裝了一套遵循了MVC理念的框架。咱們的程序在理論上大部分的時候是在處理數據,而數據的處理方式是遵循特定行業的特定業務邏輯。以界面來展現數據。那麼至少從這裏咱們能夠抽象出一下幾個關注點程序員
在這個時刻,咱們至少是能夠總結出以上的關注點,遵循分離關注點的原則,咱們至少要把這些關注點給分離開來。
在這裏,咱們是把數據和業務邏輯放在了一塊兒。由於從領域編程的角度,數據也好,業務邏輯也好。他們都是屬於某些特定領域的。好比金融領域,航空領域。因此這裏他們是能夠放在一塊兒的,其中還會包括一些其餘的,好比驗證,屬性標註等等。web
咱們看上面的一張圖能夠看到。關注點被分離。MVC的全稱是Model-View-Controler。這裏不正是咱們關注的分離點嗎數據庫
從這裏咱們能夠總結如下的概念編程
視圖:一個動態生成HTML頁面的模板
模型:模型是描述程序設計人員感興趣問題域的一些類,這些類一般封裝存儲在數據庫中的數據,以及操做這些數據和執行特定域業務邏輯的代碼。在ASP.NET MVC中,模型就像是一個使用了某個工具的數據訪問層,包括實體框架。
控制器:一個協調視圖和模型之間關係的特殊類。它響應用戶輸入,與模型進行對話,並決定呈現哪一個視圖。瀏覽器
咱們如今來具體的解讀他們之間的聯繫和各組件之間是怎麼通信和協做的,首先,咱們來看View,View的做用很直接,就是現實用戶的數據,獲取用戶的交互。也就是獲取輸入而後通過處理展示數據。上面一句話提到了「通過處理」,這裏就又有了另外的一個問題,通過什麼處理,什麼東西來處理。其實就是咱們的Controler。它獲取用戶的輸入,通過本身的處理邏輯而後將數據處理操做交給Model進行處理。Model處理了業務邏輯,完成數據以後會有兩種操做,一是由Controler處理界面邏輯,更新數據,而後View展示數據。第二種方式是處理完數據,由數據直接反應更改到View。這個時候是不通過Controler處理界面邏輯的,他們之間的關係是一個三角關係。能夠從下面的一張圖來看出他們之間的關係。
從上圖咱們能夠看到M-V-C之間的通信。這些都只是理論層面上的,從代碼層面咱們如今尚未看到代碼的執行過程。下面咱們來看一個最簡單的MVC程序,執行的深層原理咱們之後再講,這一章咱們只是看一個最簡單的程序,看看MVC的執行過程。
首先,咱們須要建立項目,打開VS,新建一個MVC空項目。這裏順便多說一句爲何是空項目。由於這樣VS不會幫咱們建立範例代碼。若是不選擇空程序,VS會幫咱們建立一些範例代碼來讓咱們瞭解MVC。框架
咱們這裏選擇空模板,視圖引擎咱們選擇Razor。視圖引擎指的是咱們操做界面的方式。好比怎麼利用數據組合html。這裏咱們不用深究Razor,之後的章節會講到Razor。測試項目咱們這裏暫時就不建立,由於咱們單單就是一個示例程序,不須要那麼複雜。建立項目以後咱們能夠看到以下的文件夾結構。工具
這裏咱們解釋一下各個文件夾的用途學習
按照通常的文件夾結構應該是還會有Content這個文件夾,至少在VS2010裏是有這個文件件夾的,可是我這裏的VS2012是沒有這個文件夾的。這個文件夾存放的是網站的通常資源文件,好比js腳本,圖片,CSS文件等等,若是沒有咱們能夠手動添加一個,或者添加一些咱們本身的文件夾。好了,項目咱們是新建出來了,那麼,咱們該怎麼開始呢?咱們前面講到了MVC實際就是Model-Controler-View。咱們就從這裏開始。首先咱們新建一個Contrler,命名爲HoneControler。具體的步驟是咱們能夠右鍵點擊Controllers文件夾,添加Controller。
咱們能夠看到以下的界面,這裏咱們一切留空,除了命名。模板咱們之後再來深刻的瞭解。這裏咱們只是簡單的看看MVC怎麼執行的。點擊肯定以後咱們能夠看到以下的代碼測試
下一步咱們修改生成的代碼,咱們把返回類型改成string,而後返回一個字符串
下面咱們就能夠直接啓動項目了,咱們能夠看到路徑是http://localhost:3222/之類的。咱們在Index中返回的字符串直接輸出到瀏覽器。這裏咱們就完成了一個最簡單的MVC。可是這個例子是不夠來解釋咱們MVC的總體執行過程的。咱們在這個例子的基礎上擴展來講明執行過程。這裏,咱們一步一步的來完成咱們完成的數據讀取的示例。
咱們添加一個方法到咱們的HomeController,方法名爲ShowMessage。
這裏須要先解釋這幾句代碼,這裏定義了一個返回值爲ActionView的方法。ActionView是 一個抽象類型,是指操做(這裏是ShowMessage方法)的結果,咱們這裏的結果就是返回一個View,也就是咱們的視圖。能夠看到咱們直接返回了View()。這裏咱們須要再解釋一個概念-約定優先於配置
約定優先於配置:在之前的不少時候,咱們在想要自定義應用程序中的一些行爲時咱們會使用配置文件,或者使用配置文件來制定應用程序中的一些特定行爲。約定優先於配置是後來提出的一種概念。它的理念是你們一致遵照一種約定以取代配置對程序的特定行爲的指定。這裏咱們的約定就是
因此,這裏當咱們直接Retrue View()的時候,解釋引擎會直接找到View----Home----ShowMessage視圖。因此下面,咱們須要添加一個與ShowMessage方法對應的View。咱們能夠右鍵點擊ShowMessage方法。選擇添加視圖。就會生成對應的視圖。
到這裏咱們的控制器和視圖已經定義完成。打開瀏覽器輸入http://localhost:3222/Home/ShowMessage咱們能夠看到咱們在ShowMessage.CSHTML中的h1標籤的內容。這裏須要注意一點,URL的端口請於本身機器具體端口相關。好了,到了這裏,咱們要解釋程序的執行過程了。
當URL進入通道後,運行時會感受URL配置來獲取Controller,Action和參數,URL路由的配置在RouteCongfig類中,代碼以下
咱們能夠看到這裏定義了路由規則url: "{controller}/{action}/{id}"不一樣的部件以「/」隔開。因此這裏劃分咱們的URL,Home就是控制器的名稱,ShowMessage就是Action的名稱,參數咱們這裏沒有。因此根據劃分獲得的URL,下面的執行步驟就是實例化HomeController調用ShowMessage方法,而ShowMessage方法返回的是ShowMessageView。因此,咱們就能夠在瀏覽器中看到ShowMessageView了。
在URL路由規則中,有一行代碼defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },這裏指定的是默認值,也就是當咱們的URL沒有指定Controller,Action,參數時的默認值。回到上面咱們最開始的URLhttp://localhost:3222/。這裏,咱們沒有指定Controller,Action。因此運行時會使用默認的路由配置來填充URL。這裏就會指向http://localhost:3222/Home/Index。
咱們使用了一個示例解釋了MVC的執行過程,可是這裏能夠看到,咱們的示例徹底只使用了C和V,沒有使用Model。因此,咱們繼續完善咱們的示例,加入數據操做,在Model文件夾下新建一個實體類Person。
在HomeController中添加一個新的Action,名稱爲ShowPerson,添加完Action以後添加對應的View,咱們要使用這個View來顯示Person的數據。
ShowPerson View代碼以下
在HomeController中,咱們實例化了Person而且在實例化的時候插入了數據。而且把person裝入ViewBag中以供視圖使用。這裏也就是使用Controller創建了View和Model的聯繫,可是這種聯繫是弱類型的。並非直接創建在View和Model之間的。這裏咱們先只瞭解ViewBag實際是一個數據集合。之後會詳細的解釋ViewBag。
最後,在瀏覽器中鍵入地址http://localhost:3222/Home/ShowPerson 能夠看到咱們的person數據。這樣咱們就完成了一個典型的MVC程序。固然也是最簡單的,咱們先只須要了解什麼是MVC,MVC是怎麼執行的等等。之後的章節咱們會詳細解析每個模塊。