MVC基礎學習—理論篇

來源:互聯網
上載者:User

標籤:

  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基礎學習—理論篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.