學習ASP.NET + MVC(一)

一.摘要

  和自身水平有關, 我總喜歡寫入門級別的文章.比如雖然做項目用過一個內部的MVC框架, 但是當看到ASP.NET MVC時我卻還是不知道從哪裏入手開始學習的好.於是我寫下這篇入門級的系列文章,  將老趙(Jeffrey Zhao)的ASP.NET MVC系列視頻課程學到的知識再理解和再消化, 讓最笨的人也能跟着我學懂ASP.NET MVC

  二.人物簡介

  本文的很多資料都來自老趙 , Jeffrey Zhao. 此人相信不必我多說了吧, 高手,前輩,偶像, 對老趙的敬仰如滔滔江水連綿不絕, 如黃河氾濫一發不可收拾......(省下口水文字若干). 在我搜索有沒有更簡單並且系統的介紹ASP.NET MVC的資料時, 搜索到了老趙在Webcast上面的系列視頻教程. 當然了高手的講解都是比較全面的, 有時侯聽了1小時, 真正理解的只有幾句話.於是有了一邊學習一邊寫此係列文章的想法.其中的知識都是從老趙的教程中學習到得.

  三.Hello ASP.NET MVC

  現在開始跟着我一步一步學習ASP.NET MVC.在什麼都不知道之前, 還是讓我們先下載一個ASP.NET MVC程序. 當看到程序運行後, 我的心纔會踏實很多.

  首先去ASP.NET MVC的官網看看:

  http://www.asp.net/mvc/

  這裏我們可以下載ASP.NET MVC的安裝文件.目前最新版本是RC1 (注:RC, 即Release Candidate版本, 是距離正式版最近的一個版本.一般要經歷RC1,2,3後即推出正式版)

  另外我們可以在CodePlex上獲取源代碼:

  http://www.codeplex.com/aspnet

  在官網上下載ASP.NET MVC安裝文件, 一路回車完成安裝. 啓動VS2008 SP1(不是VS2008?不是SP1?作爲一個專業的IT人士,水平可以菜,軟件咱一定要用新的!去找個新版本吧!),點擊新建,在Web中可以找到:

學習ASP.NET MVC(一) 開天闢地入門篇

 

點擊確定即創建了一個默認的MVC項目.同時還會創建一個測試項目. 這些我現在都不懂也不關注, 直接將Web項目中的default.aspx設置爲啓動頁, 運行項目, 一個ASP.NET MVC的項目已經運行在我的電腦上了:

學習ASP.NET MVC(一) 開天闢地入門篇

  圖片看不清楚?請點擊這裏查看原圖(大圖)。

  而且那個Home和About還能點擊!雖然現在我什麼都不懂, 不過看着能運行的實例, 心裏就踏實多了!

  四.學習MVC的概念

  老趙的視頻教程第一講是"MVC模式與ASP.NET MVC框架概述".主要講解MVC的概念.那麼讓我們先來學習概念.

  我是如此理解MVC的:

  我們現在的一個ASP.NET頁面通常需要做這些事情:

  1.獲取一個頁面需要的數據. 

  2.在頁面的Page_Load(頁面加載)方法中爲我們的頁面控件綁定數據

  3.瀏覽器顯示頁面

  MVC即Model, View, Controller

  Model就是我們1中獲取的網頁需要的數據

  Controller就是我們獲取數據,然後將數據綁定到頁面控件的這個業務流程.不十分正確但是可以先這樣理解: Controller就是我們的Page_Load方法邏輯.

  View就是我們的aspx頁面,注意這是一個不包含後臺代碼文件的aspx頁面.(其實帶有.asp.cs文件也不會有編譯錯誤,但是這樣寫代碼就違背了MVC的設計初衷)

 下面這張圖很好的概括了MVC的作用:

學習ASP.NET MVC(一) 開天闢地入門篇

  一個URL請求, ASP.NET MVC引擎會分析這個URL要使用那個Controller, 這個Controller(實際上真正的方法是Controller的Action)從數據庫或者其他數據源獲取數據,通常這些數據是一個業務的模型類 (即MVC中的Model). Controller將Model對象傳遞給頁面(即MVC中的View), 頁面顯示在瀏覽器上.(這一步是ViewEngine的功能, 我們一般的ASPX頁面使用的是WebForm的ViewEngine,當然也可以替換.)

  五.學習實例首頁

  簡單的概念也有了.實例也能運行了.現在就是看看這個實例是如何使用ASP.NET MVC的.從首頁下手.

  1.尋找入口方法

  首頁網站的地址應該是 http://localhost:1847/home/index , 爲什麼地址不是具體的頁面但是最後卻將請求提交給了view/home/Index.aspx 頁面? 很明顯是使用了URL重寫. ASP.NET中叫做UrlRouting,對應的程序集是System.Web.Routing, 打開項目的Global.asax.cs文件, 會找到我們建立的頁面重寫規則:

    public static void RegisterRoutes(RouteCollection routes)
    {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
        "Default",                       // Route name
        "{controller}/{action}/{id}",              // URL with parameters
        new { controller = "Home", action = "Index", id = "" } // Parameter defaults
      );

    }

    protected void Application_Start()
    {
      RegisterRoutes(RouteTable.Routes);
    }

 

關於Routing的深入瞭解將在以後介紹, 這裏我們完全可以照葫蘆畫瓢, 按照實例添加新的重寫規則.

  最後, http://localhost:1847/home/index 就被解析爲:

  Controller爲Home, Action爲Index, 沒有id參數.

  2.尋找Controller

  在Controllers文件夾下我們可以找到HomeController.cs, 這裏使用了一個約定, 就是如果URL中獲取到的Controller名字是Home, 則他的Controller類名就是HomeController. 在URL中的名字後加上”Controller”.

  實例中Controller都放在Controllers文件夾, 所以我們可以按照命名約定很容易就可以找到HomeController類

  3.尋扎Action

  打開HomeControllers.cs, 發現裏面有兩個方法:

    public ActionResult Index()
    {
      ViewData["Message"] = "Welcome to ASP.NET MVC!";

      return View();
    }

    public ActionResult About()
    {
      return View();
    }

 

 其中的Index和About都是Action.這個Action是個什麼東東呢?目前我只知道一個Controller可以包含多個Action, MVC模式中Controller角色的具體實現邏輯都是在Action中的.

  因爲我們的Action是Index, 所以自然就要調用Index()方法.這裏將"Webcome to ASP.NET MVC!", 這裏的Model角色就是這句話, 也就是一個字符串對象.

  Controller的一個重要作用就是將Model對象傳遞給View,也就是具體的頁面. 傳遞的方法就是將這個字符串放到ViewData這個集合對象中, 然後在頁面上也調用這個對象獲取數據. 這個ViewData 對象一定是靜態的, 或者至少是和HttpContext對象關聯的, 否則到了View頁面上是不能夠調用的.但是也不知道ASP.NET MVC是在什麼時候創建了這個對象.有心深入的一會去源代碼裏找找就能找到答案了.

  4.尋找View

  Model有了,數據有了, 接下來要跳轉到View去顯示數據了.第一個問題就是如何從Controller中跳到View上? return View() 這句話實現了此功能.其實如果這樣寫大家會更清楚

    public ActionResult Index()
    {
      ViewData["Message"] = "Welcome to ASP.NET MVC!";

      return View("index");
    }

 

  View方法中可以帶一個名字, 這個名字就是View的名字.如果把index改成about,那麼訪問/home/index就會跳轉到about頁!

  雖然知道了我們要返回到名稱是"index"的View上, 但是這個View的頁面在哪裏呢?在Web中有一個Views文件夾:

學習ASP.NET MVC(一) 開天闢地入門篇

  這裏面存放的都是View對象, 也就是隻有顯示功能的aspx頁面文件.但是aspx文件要遵循約定: Views下面要按照Controller創建文件夾, 比如HomeController就對應Home文件夾, 然後在裏面添加view, 比如index.aspx, 那麼在HomeController中返回到名爲Index的View對象實際就會返回Views/Home/Index.aspx頁面.

 

如果不寫View的名字, 則認爲Action的名稱就是View的名稱.

  5.頁面展示

  最後的工作就是View頁面使用Model數據完整頁面顯示工作, 在index.aspx這個沒有後臺代碼的View對象中, 通過ViewData對象獲取Model:

<%= Html.Encode(ViewData["Message"]) %>

  接下來ViewEngine即頁面引擎會將aspx中的HTML部分以及上面的數據部分和在一起返回給瀏覽器.

  關於View對象我注意到此頁面是繼承自System.Web.Mvc.ViewPage而不是直接繼承自System.Web.UI.Page, 而這個ViewData對象就是ViewPage中的一個屬性. 這裏的ViewData一定是頁面級別的,當頁面編譯完畢這個對象就會被註銷(HTTP是無狀態的協議,每次請求其實都是生成一個新的ViewPage對象).

 

  六.總結

  雖然僅僅是第一篇入門文章, 但是是不是覺得已經會用ASP.NET MVC了? 雖然學習不可以驕傲, 但是可以自豪的是ASP.NET MVC我已經不再陌生, 即使不能駕輕就熟, 偶爾說出來幾個概念,給你解釋解釋啥是MVC, 還是很能嚇唬人的. 這篇文章相當於老趙前兩篇視頻的知識. 本着每日一篇的原則, 我將會繼續學習老趙的系列教程,  將自己的理解貢獻出來. 不求最深, 但求易懂.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章