原文鏈接:http://www./learn/mvc/tutorial-02-cs.aspx 這篇教程將為你提供ASP.NET MVC模型,、視圖,、控制器的高層次概覽。換言之,,它解釋了ASP.NET MVC中的“M”,、“V”和“C”。 在讀完本教程之后,,你應(yīng)該能夠理解ASP.NET MVC應(yīng)用程序中的各個(gè)不同部分是如何一起工作的,。你也應(yīng)該能夠理解ASP.NET MVC應(yīng)用程序與ASP.NET Web窗體應(yīng)用程序和動(dòng)態(tài)服務(wù)器頁(yè)面應(yīng)用程序在構(gòu)架上有何不同。 1. 范例ASP.NET MVC應(yīng)用程序Visual Studio用于創(chuàng)建ASP.NET MVC Web應(yīng)用程序的默認(rèn)模板包括了一個(gè)極其簡(jiǎn)單的范例應(yīng)用程序,,可以使用它來(lái)理解ASP.NET MVC應(yīng)用程序的各個(gè)部分,。我們將會(huì)在這篇教程中利用這個(gè)簡(jiǎn)單的應(yīng)用程序。 你可以通過(guò)啟動(dòng)Visual Studio2008,,并且在菜單中選擇“File(文件)”,、“New Project(新建項(xiàng)目)”來(lái)使用MVC模板創(chuàng)建一個(gè)新的ASP.NET MVC應(yīng)用程序(如圖1)。在“新建項(xiàng)目”對(duì)話(huà)框,,在項(xiàng)目類(lèi)型下選擇你喜歡的編程語(yǔ)言(Visual Basic或者C#),,并且在模板下選擇ASP.NET MVC Web應(yīng)用程序。點(diǎn)擊“確定”按鈕,。 圖1 - 新建項(xiàng)目對(duì)話(huà)框 當(dāng)你創(chuàng)建一個(gè)新的ASP.NET MVC應(yīng)用程序時(shí),,將會(huì)出現(xiàn)“創(chuàng)建單元測(cè)試項(xiàng)目(Create Unit Test Project)”對(duì)話(huà)框(如圖2)。這個(gè)對(duì)話(huà)框允許你在解決方案下創(chuàng)建一個(gè)獨(dú)立的項(xiàng)目用于測(cè)試你的ASP.NET MVC應(yīng)用程序,。選擇選項(xiàng)“No, do not create a unit test project(否,,不要?jiǎng)?chuàng)建單元測(cè)試項(xiàng)目)”,并且點(diǎn)擊“OK(確定)”按鈕,。 圖2 - 創(chuàng)建單元測(cè)試對(duì)話(huà)框 在新的ASP.NET MVC應(yīng)用程序創(chuàng)建好之后,。你將會(huì)在解決方案瀏覽器窗口中看到幾個(gè)文件夾和文件。特別地,,你將會(huì)看到三個(gè)文件夾,,名字是Models、Views和Controllers,。正如你從文件夾的名稱(chēng)可以推測(cè)出的,,這三個(gè)文件夾包含了實(shí)現(xiàn)了模型、視圖和控制器的文件,。 如果你展開(kāi)Controller文件夾,,你應(yīng)該會(huì)看到一個(gè)命名為HomeController.cs的文件。如果你展開(kāi)Views文件夾,,你應(yīng)該看到兩個(gè)子文件夾,,名稱(chēng)是Home和Shared。如果你展開(kāi)Home文件夾,你將會(huì)再次看到兩個(gè)文件,,名稱(chēng)是About.aspx和Home.aspx(見(jiàn)圖3),。這些文件組成了這個(gè)包含在默認(rèn)ASP.NET MVC模板中的范例應(yīng)用程序。 圖3 - 解決方案瀏覽器窗口 你可以通過(guò)選擇菜單項(xiàng)“Debug(調(diào)試)”,、“Start Debugging(啟動(dòng)調(diào)試)”來(lái)運(yùn)行這個(gè)范例應(yīng)用程序,。除此以外,你可以點(diǎn)擊F5鍵,。 當(dāng)你第一次運(yùn)行ASP.NET應(yīng)用程序,,將會(huì)出現(xiàn)圖4中的對(duì)話(huà)框,建議你開(kāi)啟調(diào)試模式,。點(diǎn)擊“確定”按鈕將會(huì)運(yùn)行應(yīng)用程序,。 圖4 - 未開(kāi)啟調(diào)試對(duì)話(huà)框 當(dāng)你運(yùn)行一個(gè)ASP.NET MVC應(yīng)用程序,Visual Studio會(huì)在你的web瀏覽器中運(yùn)行應(yīng)用程序,。這個(gè)范例應(yīng)用程序只含有兩個(gè)頁(yè)面:Index頁(yè)面和About頁(yè)面,。當(dāng)應(yīng)用程序第一次啟動(dòng)時(shí),將會(huì)顯示Index頁(yè)面(見(jiàn)圖5),。你可以通過(guò)點(diǎn)擊應(yīng)用程序右上角的菜單鏈接導(dǎo)航到About頁(yè)面,。 圖5 - Index頁(yè)面 注意一下你瀏覽器地址欄中的URL。當(dāng)你點(diǎn)擊Home菜單鏈接,,瀏覽器地址欄的URL將變?yōu)?b>/Home,。當(dāng)你點(diǎn)擊About菜單鏈接,,瀏覽器地址欄的URL變?yōu)?b>/About,。 2. 一個(gè)URL并不等同于一個(gè)頁(yè)面當(dāng)你創(chuàng)建一個(gè)傳統(tǒng)的ASP.NET Web窗體應(yīng)用程序,或者是一個(gè)動(dòng)態(tài)服務(wù)器頁(yè)面(ASP)應(yīng)用程序,,在URL與頁(yè)面之間存在一對(duì)一的對(duì)應(yīng),。如果你請(qǐng)求服務(wù)器上的一個(gè)名為SomePage.aspx的頁(yè)面,那么最好在磁盤(pán)上有一個(gè)SomePage.aspx頁(yè)面,。如果SomePage.aspx文件并不存在,,你將會(huì)獲得一個(gè)丑陋的404-頁(yè)面不存在錯(cuò)誤。 當(dāng)創(chuàng)建一個(gè)ASP.NET MVC應(yīng)用程序時(shí)則大不相同,,你鍵入到瀏覽器地址欄的URL與你應(yīng)用程序中的文件之間并沒(méi)有一個(gè)對(duì)應(yīng)關(guān)系,。在一個(gè)ASP.NET MVC應(yīng)用程序中,一個(gè)URL與一個(gè)控制器的動(dòng)作相對(duì)應(yīng),,而不是磁盤(pán)上的頁(yè)面,。 對(duì)于一個(gè)傳統(tǒng)的ASP.NET或者ASP應(yīng)用程序,瀏覽器請(qǐng)求被映射到了頁(yè)面,。在A(yíng)SP.NET MVC應(yīng)用程序中,,瀏覽器請(qǐng)求被映射到了控制器動(dòng)作。一個(gè)ASP.NET Web窗體應(yīng)用程序是以?xún)?nèi)容為中心的。而一個(gè)ASP.NET MVC應(yīng)用程序則以是應(yīng)用程序邏輯為中心的,。 3. 理解URL路由一個(gè)瀏覽器請(qǐng)求通過(guò)名叫URL路由(URL Routing)的ASP.NET MVC功能被映射到了一個(gè)控制器動(dòng)作,。URL路由將即將到來(lái)的請(qǐng)求發(fā)送到了控制器動(dòng)作。 URL路由使用一張路由表來(lái)處理來(lái)到的請(qǐng)求,。這個(gè)路由表在你的Web應(yīng)用程序首次啟動(dòng)時(shí)創(chuàng)建,。這個(gè)路由表建立在Global.asax文件中。代碼清單1包含了這個(gè)默認(rèn)的MVC Global.asax文件,。 代碼清單1 - Glabal.asax using System; 當(dāng)ASP.NET應(yīng)用程序第一次啟動(dòng)時(shí),,將調(diào)用Application_Start()方法。在代碼清單1中,,這個(gè)方法調(diào)用了RegisterRoutes()方法,,并且RegisterRoutes()方法創(chuàng)建了默認(rèn)的路由表。 默認(rèn)的路由表只含有一個(gè)路由,。這個(gè)默認(rèn)的路由將所有到來(lái)的請(qǐng)求分為了三個(gè)分段(一個(gè)URL分段是正斜杠之間的任何東西),。第一個(gè)分段映射到了控制器名稱(chēng),第二個(gè)分段映射到了動(dòng)作名稱(chēng),,最后一個(gè)分段映射到了傳遞給動(dòng)作的名為Id的參數(shù),。 例如,考慮下面的URL: /Product/Details/3 這個(gè)URL將會(huì)被解析為像這樣的三個(gè)部分: Controller = ProductController Action = Details Id = 3 注意到Controller后綴被添加到了控制器參數(shù)的末尾,。這只是MVC的一個(gè)怪癖而已,。 默認(rèn)的路由包含所有三個(gè)分段的默認(rèn)值。默認(rèn)的控制器是HomeController,,默認(rèn)的動(dòng)作是Index,,默認(rèn)的Id是一個(gè)空字符串。腦子里記下這三個(gè)默認(rèn)值,,考慮下面的URL是如何被解析的: /Employee 這個(gè)URL將被解析為像這樣的三個(gè)參數(shù): Controller = EmployeeController Action = Index Id = "" 最后,,如果你打開(kāi)一個(gè)ASP.NET MVC應(yīng)用程序而不提供任何的URL(例如,http://localhost),,然后這個(gè)URL將會(huì)被解析成這樣: Controller = HomeController Action = Index Id = "" 這個(gè)請(qǐng)求被發(fā)送到了HomeController類(lèi)的Index()動(dòng)作,。 4. 理解控制器控制器負(fù)責(zé)用戶(hù)與MVC應(yīng)用程序交互的方式。當(dāng)用戶(hù)發(fā)出瀏覽器請(qǐng)求時(shí),,控制器決定向用戶(hù)發(fā)回什么樣的響應(yīng),。 控制器不過(guò)是一個(gè)類(lèi)(例如,一個(gè)Visual Basic或者C#類(lèi)),。這個(gè)范例ASP.NET MVC應(yīng)用程序包含一個(gè)名為HomeController.cs的控制器,,它位于Controllers文件夾下。HomeController.cs的內(nèi)容再次顯示在了代碼清單2中,。 代碼清單2 - HomeConroller.cs using System; 注意到HomeController擁有兩個(gè)方法,,名為Index()和About()。這兩個(gè)方法對(duì)應(yīng)于控制器暴露出的兩個(gè)動(dòng)作,。URL /Home/Index將會(huì)調(diào)用HomeController.Index()方法,,而URL /Home/About會(huì)調(diào)用HomeController.About()方法,。 控制器中的任何公共方法都被暴露為一個(gè)控制器動(dòng)作,。對(duì)此你需要多加小心。這就意味著包含在控制器中的任何公共方法都可以由任何可以訪(fǎng)問(wèn)互聯(lián)網(wǎng)的人調(diào)用,,通過(guò)在瀏覽器中輸入正確的URL,。 5. 理解視圖由HomeController類(lèi)暴露出的兩個(gè)控制器動(dòng)作,,Index()和About(),,都返回了一個(gè)視圖,。視圖含有將會(huì)發(fā)送給瀏覽器HTML標(biāo)記和內(nèi)容。當(dāng)使用ASP.NET MVC應(yīng)用程序時(shí),,一個(gè)視圖等同于一個(gè)頁(yè)面,。 你必須在正確的位置創(chuàng)建你的視圖,。HomeController.Index()動(dòng)作返回了一個(gè)位于以下路徑的視圖: \Views\Home\Index.aspx HomeController.About()動(dòng)作返回一個(gè)位于以下路徑的視圖: \Views\Home\About.aspx 一般而言,,如果你想為一個(gè)控制器動(dòng)作返回一個(gè)視圖,,那么你需要在Views文件夾下創(chuàng)建一個(gè)子文件夾,這個(gè)文件夾與你的控制器同名,。在子文件夾下,你必須創(chuàng)建一個(gè).aspx文件,,它的名字與控制器動(dòng)作相同,。 代碼清單3中的文件含有About.aspx視圖,。 代碼清單3 - About.aspx <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 如果你忽略代碼清單中的第一行,,視圖剩余的大部分是由標(biāo)準(zhǔn)的HTML構(gòu)成的。你可以在這里輸入任何你想要的HTML來(lái)修改視圖的內(nèi)容,。 視圖非常類(lèi)似于動(dòng)態(tài)服務(wù)器頁(yè)面(ASP)中的頁(yè)面,,或者ASP.NET的Web窗體,。視圖可以含有HTML內(nèi)容和腳本,。你可以使用你所喜愛(ài)的.NET語(yǔ)言(例如,C#或者Visual Basic .Net)編寫(xiě)腳本,。你使用腳本顯示動(dòng)態(tài)的內(nèi)容,,例如數(shù)據(jù)庫(kù)數(shù)據(jù)。 6. 理解模型我們已經(jīng)討論了控制器,,我們也討論了視圖,。我們需要討論的最后一個(gè)話(huà)題是模型,。MVC模型是什么呢,? MVC的模型包含了你應(yīng)用程序中的所有邏輯,這些邏輯沒(méi)有包含在視圖或者控制器中,。模型應(yīng)該包含你的應(yīng)用程序中的所有業(yè)務(wù)邏輯和數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)邏輯,。例如,,如果你使用LINQ to SQL訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),,那么你可以在Models文件夾中創(chuàng)建你的LINQ to SQL類(lèi)(你的dbml文件)。 視圖應(yīng)該僅包含與生成用戶(hù)界面有關(guān)的邏輯,??刂破鲬?yīng)該僅僅只包含最少量的邏輯,,用于返回正確的視圖或者將用戶(hù)重定向到另一個(gè)動(dòng)作。任何其他的事情都應(yīng)該包含在模型中,。 通常,,你應(yīng)該竭盡全力創(chuàng)建一個(gè)豐富的模型以及一個(gè)瘦小的控制器。你的控制器方法應(yīng)該只包含幾行代碼,。如果一個(gè)控制器動(dòng)作變得太豐富,那么你應(yīng)該考慮將這些邏輯抽取出來(lái)放置到Models文件夾的新類(lèi)中,。 7. 總結(jié)這篇教程為你提供了ASP.NET MVC Web應(yīng)用程序各個(gè)不同部分的一個(gè)高層次的概覽。你學(xué)習(xí)了URL路由如何將即將到來(lái)的瀏覽器請(qǐng)求發(fā)往特定的控制器動(dòng)作,。你還學(xué)習(xí)了控制器是如何協(xié)調(diào)視圖怎樣返回瀏覽器的,。最后,你學(xué)習(xí)了模型是怎樣包含應(yīng)用程序的業(yè)務(wù)和數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)邏輯的,。 |
|
來(lái)自: _明心見(jiàn)性_ > 《MVC》