《从零开始学习ASP.NET MVC 1.0》-开天辟地入门篇
《從零開(kāi)始學(xué)習(xí)ASP.NET MVC 1.0》 文章導(dǎo)航
- (一) 開(kāi)天辟地入門(mén)篇
- (二) 識(shí)別URL的Routing組件
- (三) Controller/Action 深入解析與應(yīng)用實(shí)例
- (四) View/Model 全解
- (五) ViewEngine 深入解析與應(yīng)用實(shí)例
?
一.摘要
隨著ASP.NET MVC 1.0版本的正式發(fā)布, 我將本系列文章也更新到了1.0, 對(duì)于已經(jīng)發(fā)表的文章我都會(huì)根據(jù)1.0版本重新編輯. 希望本系列文章能打給大家?guī)椭?
?
二.前言
ASP.NET MVC是微軟官方提供的開(kāi)源MVC框架. 在經(jīng)過(guò)了漫長(zhǎng)的preview和2個(gè)RC版本后, 終于發(fā)布了1.0版本.其實(shí)從RC開(kāi)始ASP.NET MVC的核心代碼就已經(jīng)趨于穩(wěn)定.所以現(xiàn)在開(kāi)始學(xué)習(xí)ASP.NET MVC是一個(gè)很好的時(shí)間點(diǎn).學(xué)習(xí)的早,而且不用擔(dān)心知識(shí)過(guò)時(shí).
本系列教程是我在學(xué)習(xí)ASP.NET MVC時(shí)的總結(jié), 比如雖然我學(xué)習(xí)老趙的視頻教程, 但是因?yàn)榘姹据^老, 一般我都要從最新版本上進(jìn)行知識(shí)的校驗(yàn)與升華, 然后將最后的精華總結(jié)出來(lái)寫(xiě)成文字. 現(xiàn)在還在不斷的學(xué)習(xí), 不斷地寫(xiě)作.希望大家喜歡本系列文章, 我將用精益求精的精神寫(xiě)本系列文章.
三.Hello ASP.NET MVC
現(xiàn)在開(kāi)始跟著我一步一步學(xué)習(xí)ASP.NET MVC.在什么都不知道之前, 還是讓我們先下載一個(gè)ASP.NET MVC程序. 當(dāng)看到程序運(yùn)行后, 我的心才會(huì)踏實(shí)很多.
首先去ASP.NET MVC的官網(wǎng)看看:
http://www.asp.net/mvc/
這里我們可以下載ASP.NET MVC的安裝文件.目前最新版本是1.0,另外我們可以在CodePlex上獲取源代碼:
http://www.codeplex.com/aspnet
在官網(wǎng)上下載ASP.NET MVC安裝文件, 一路回車(chē)完成安裝. 啟動(dòng)VS2008 SP1(不是VS2008?不是SP1?作為一個(gè)專(zhuān)業(yè)的IT人士,水平可以菜,軟件咱一定要用新的!去找個(gè)新版本吧!),點(diǎn)擊新建,在Web中可以找到:
點(diǎn)擊確定即創(chuàng)建了一個(gè)默認(rèn)的MVC項(xiàng)目.同時(shí)還會(huì)創(chuàng)建一個(gè)測(cè)試項(xiàng)目. 這些我現(xiàn)在都不懂也不關(guān)注, 直接將Web項(xiàng)目中的default.aspx設(shè)置為啟動(dòng)頁(yè), 運(yùn)行項(xiàng)目, 一個(gè)ASP.NET MVC的項(xiàng)目已經(jīng)運(yùn)行在我的電腦上了:
而且那個(gè)Home和About還能點(diǎn)擊!雖然現(xiàn)在我什么都不懂, 不過(guò)看著能運(yùn)行的實(shí)例, 心里就踏實(shí)多了!
四.學(xué)習(xí)MVC的概念
一個(gè)ASP.NET頁(yè)面通常需要做這些事情:
MVC即Model, View, Controller
Model就是我們1中獲取的網(wǎng)頁(yè)需要的數(shù)據(jù)
Controller就是我們獲取數(shù)據(jù),然后將數(shù)據(jù)綁定到頁(yè)面控件的這個(gè)業(yè)務(wù)流程.不十分正確但是可以先這樣理解: Controller就是我們的Page_Load方法邏輯.
View就是我們的aspx頁(yè)面,注意這是一個(gè)不包含后臺(tái)代碼文件的aspx頁(yè)面.(其實(shí)帶有.asp.cs文件也不會(huì)有編譯錯(cuò)誤,但是這樣寫(xiě)代碼就違背了MVC的設(shè)計(jì)初衷)
下面這張圖很好的概括了MVC的作用:
一個(gè)URL請(qǐng)求, ASP.NET MVC引擎會(huì)分析這個(gè)URL要使用那個(gè)Controller, 這個(gè)Controller(實(shí)際上真正的方法是Controller的Action)從數(shù)據(jù)庫(kù)或者其他數(shù)據(jù)源獲取數(shù)據(jù),通常這些數(shù)據(jù)是一個(gè)業(yè)務(wù)的模型類(lèi)(即MVC中的Model). Controller將Model對(duì)象傳遞給頁(yè)面(即MVC中的View),? 頁(yè)面顯示在瀏覽器上.(這一步是ViewEngine的功能, 我們一般的ASPX頁(yè)面使用的是WebForm的ViewEngine,當(dāng)然也可以替換.)
五.學(xué)習(xí)實(shí)例首頁(yè)
簡(jiǎn)單的概念也有了.實(shí)例也能運(yùn)行了.現(xiàn)在就是看看這個(gè)實(shí)例是如何使用ASP.NET MVC的.從首頁(yè)下手.
1.尋找入口方法
首頁(yè)網(wǎng)站的地址應(yīng)該是 http://localhost:1847/home/index (1847是端口號(hào),隨機(jī)生成,所以會(huì)不同), 為什么地址不是具體的頁(yè)面但是最后卻將請(qǐng)求提交給了view/home/Index.aspx 頁(yè)面? 很明顯是使用了URL重寫(xiě). ASP.NET中叫做UrlRouting,對(duì)應(yīng)的程序集是System.Web.Routing, 打開(kāi)項(xiàng)目的Global.asax.cs文件, 會(huì)找到我們建立的頁(yè)面重寫(xiě)規(guī)則:
public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute("Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controller = "Home", action = "Index", id = "" } // Parameter defaults);}protected void Application_Start(){RegisterRoutes(RouteTable.Routes);}
?
關(guān)于Routing的深入了解將在以后介紹, 這里我們完全可以照葫蘆畫(huà)瓢, 按照實(shí)例添加新的重寫(xiě)規(guī)則.
最后, http://localhost:1847/home/index 就被解析為:
Controller為Home, Action為Index, 沒(méi)有id參數(shù).
2.尋找Controller
在Controllers文件夾下我們可以找到HomeController.cs, 這里使用了一個(gè)約定, 就是如果URL中獲取到的Controller名字是Home, 則他的Controller類(lèi)名就是HomeController. 在URL中的名字后加上”Controller”.
實(shí)例中Controller都放在Controllers文件夾, 所以我們可以按照命名約定很容易就可以找到HomeController類(lèi)
3.尋扎Action
打開(kāi)HomeControllers.cs, 發(fā)現(xiàn)里面有兩個(gè)方法:
public ActionResult Index(){ViewData["Message"] = "Welcome to ASP.NET MVC!";return View();}public ActionResult About(){return View();}
其中的Index和About都是Action.這個(gè)Action是個(gè)什么東東呢?目前我只知道一個(gè)Controller可以包含多個(gè)Action, MVC模式中Controller角色的具體實(shí)現(xiàn)邏輯都是在Action中的.
因?yàn)槲覀兊腁ction是Index, 所以自然就要調(diào)用Index()方法.這里將"Webcome to ASP.NET MVC!", 這里的Model角色就是這句話(huà), 也就是一個(gè)字符串對(duì)象.
Controller的一個(gè)重要作用就是將Model對(duì)象傳遞給View,也就是具體的頁(yè)面. 傳遞的方法就是將這個(gè)字符串放到ViewData這個(gè)集合對(duì)象中, 然后在頁(yè)面上也調(diào)用這個(gè)對(duì)象獲取數(shù)據(jù). 這個(gè)ViewData 對(duì)象一定是靜態(tài)的, 或者至少是和HttpContext對(duì)象關(guān)聯(lián)的, 否則到了View頁(yè)面上是不能夠調(diào)用的.但是也不知道ASP.NET MVC是在什么時(shí)候創(chuàng)建了這個(gè)對(duì)象.有心深入的一會(huì)去源代碼里找找就能找到答案了.
4.尋找View
Model有了,數(shù)據(jù)有了, 接下來(lái)要跳轉(zhuǎn)到View去顯示數(shù)據(jù)了.第一個(gè)問(wèn)題就是如何從Controller中跳到View上? return View() 這句話(huà)實(shí)現(xiàn)了此功能.其實(shí)如果這樣寫(xiě)大家會(huì)更清楚:
public ActionResult Index(){ViewData["Message"] = "Welcome to ASP.NET MVC!";return View("index");}?
View方法中可以帶一個(gè)名字, 這個(gè)名字就是View的名字.如果把index改成about,那么訪(fǎng)問(wèn)/home/index就會(huì)跳轉(zhuǎn)到about頁(yè)!
雖然知道了我們要返回到名稱(chēng)是"index"的View上, 但是這個(gè)View的頁(yè)面在哪里呢?在Web中有一個(gè)Views文件夾:
這里面存放的都是View對(duì)象, 也就是只有顯示功能的aspx頁(yè)面文件.但是aspx文件要遵循約定: Views下面要按照Controller創(chuàng)建文件夾, 比如HomeController就對(duì)應(yīng)Home文件夾, 然后在里面添加view, 比如index.aspx, 那么在HomeController中返回到名為Index的View對(duì)象實(shí)際就會(huì)返回Views/Home/Index.aspx頁(yè)面.
如果不寫(xiě)View的名字, 則認(rèn)為Action的名稱(chēng)就是View的名稱(chēng).
5.頁(yè)面展示
最后的工作就是View頁(yè)面使用Model數(shù)據(jù)完整頁(yè)面顯示工作, 在index.aspx這個(gè)沒(méi)有后臺(tái)代碼的View對(duì)象中, 通過(guò)ViewData對(duì)象獲取Model:
<%= Html.Encode(ViewData["Message"]) %>?
接下來(lái)ViewEngine即頁(yè)面引擎會(huì)將aspx中的HTML部分以及上面的數(shù)據(jù)部分和在一起返回給瀏覽器.
關(guān)于View對(duì)象我注意到此頁(yè)面是繼承自System.Web.Mvc.ViewPage而不是直接繼承自System.Web.UI.Page, 而這個(gè)ViewData對(duì)象就是ViewPage中的一個(gè)屬性. 這里的ViewData一定是頁(yè)面級(jí)別的,當(dāng)頁(yè)面編譯完畢這個(gè)對(duì)象就會(huì)被注銷(xiāo)(HTTP是無(wú)狀態(tài)的協(xié)議,每次請(qǐng)求其實(shí)都是生成一個(gè)新的ViewPage對(duì)象).
六.總結(jié)
雖然僅僅是第一篇入門(mén)文章, 但是是不是覺(jué)得已經(jīng)會(huì)用ASP.NET MVC了? 雖然學(xué)習(xí)不可以驕傲, 但是可以自豪的是ASP.NET MVC我已經(jīng)不再陌生, 即使不能駕輕就熟, 偶爾說(shuō)出來(lái)幾個(gè)概念,給你解釋解釋啥是MVC, 還是很能?chē)樆H说? 在后續(xù)文章中,我將對(duì)MVC的各種細(xì)節(jié)做具體的講解.希望大家喜歡本系列文章!
轉(zhuǎn)載于:https://www.cnblogs.com/dudu837/archive/2009/04/27/1444811.html
總結(jié)
以上是生活随笔為你收集整理的《从零开始学习ASP.NET MVC 1.0》-开天辟地入门篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 群联、希捷发布“全球最先进”PCIe 4
- 下一篇: asp.net ajax控件工具集 Au