Net MVC基礎(chǔ)教程_第1頁(yè)
Net MVC基礎(chǔ)教程_第2頁(yè)
Net MVC基礎(chǔ)教程_第3頁(yè)
Net MVC基礎(chǔ)教程_第4頁(yè)
Net MVC基礎(chǔ)教程_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、應(yīng)用程序開(kāi)發(fā)中,例如頁(yè)面代碼只進(jìn)行頁(yè)面布局和樣式的輸出而代碼頁(yè)面只負(fù)責(zé)進(jìn)行邏輯的處理。為了解決這個(gè)問(wèn)題,微軟開(kāi)發(fā)了MVC開(kāi)發(fā)模式方便開(kāi)發(fā)人員進(jìn)行分層開(kāi)發(fā)。17.1 了解MVCMVC是一個(gè)設(shè)計(jì)模式,MVC能夠?qū)SP.NET應(yīng)用程序的視圖、模型和控制器進(jìn)行分開(kāi),開(kāi)發(fā)人員能夠在不同的層次中進(jìn)行應(yīng)用程序?qū)哟蔚拈_(kāi)發(fā),例如開(kāi)發(fā)人員能夠在視圖中進(jìn)行頁(yè)面視圖的開(kāi)發(fā),而在控制器中進(jìn)行代碼的實(shí)現(xiàn)。 MVC和Web Form在ASP.NET Web Form的開(kāi)發(fā)當(dāng)中,用戶能夠方便的使用微軟提供的服務(wù)器控件進(jìn)行應(yīng)用程序的開(kāi)發(fā),從而提高開(kāi)發(fā)效率。雖然ASP.NET Web Form提高了開(kāi)發(fā)速度、維護(hù)效率和代碼的復(fù)

2、用性,但是拋棄了傳統(tǒng)的網(wǎng)頁(yè)編程模型,在很多應(yīng)用問(wèn)題的解決上反而需要通過(guò)復(fù)雜的實(shí)現(xiàn)完成。在ASP.NET MVC模型中,ASP.NET MVC模型給開(kāi)發(fā)人員的感覺(jué)仿佛又回到了傳統(tǒng)的網(wǎng)頁(yè)編程模型中(如ASP編程模型),但是ASP.NET MVC模型與傳統(tǒng)的ASP同樣是不同的編程模型,因?yàn)锳SP.NET MVC模型同樣是基于面向?qū)ο蟮乃枷脒M(jìn)行應(yīng)用程序的開(kāi)發(fā)。相比之下,ASP.NET MVC模型是一種思想,而不是一個(gè)框架,所以ASP.NET MVC模型與ASP.NET Web Form并不具有可比性。同樣ASP.NET MVC模型也不是ASP.NET Web Form 4.0,這兩個(gè)開(kāi)發(fā)模型就好比一個(gè)

3、是汽車一個(gè)是飛機(jī),而兩者都能夠達(dá)到同樣的目的。應(yīng)用程序一樣。當(dāng)用戶通過(guò)瀏覽器請(qǐng)求服務(wù)器中的某個(gè)頁(yè)面時(shí),其實(shí)是實(shí)現(xiàn)了ASP.NET MVC模型中的一個(gè)方法,而不是具體的頁(yè)面,這在另一種程度上實(shí)現(xiàn)了URL偽靜態(tài)。當(dāng)用戶通過(guò)瀏覽器請(qǐng)求服務(wù)器中的某一個(gè)路徑時(shí),ASP.NET MVC應(yīng)用程序會(huì)攔截相應(yīng)的地址并進(jìn)行路由解析,通過(guò)應(yīng)用程序中編程實(shí)現(xiàn)展現(xiàn)一個(gè)頁(yè)面給用戶,這種頁(yè)面展現(xiàn)手法同傳統(tǒng)的ASP.NET Web From應(yīng)用程序與其他的如ASP,PHP等應(yīng)用程序都不相同。同時(shí),隨著互聯(lián)網(wǎng)的發(fā)展,搜索引擎在Web開(kāi)發(fā)中起著重要的作用,這就對(duì)頁(yè)面請(qǐng)求的地址有了更加嚴(yán)格的要求。例如百度、谷歌等搜索引擎會(huì)對(duì)目錄形

4、式的頁(yè)面路徑和靜態(tài)形式的頁(yè)面路徑收錄的更好,而對(duì)于動(dòng)態(tài)的如abc.aspx?id=1&action=add&t=3這種樣式的頁(yè)面路徑不甚友好。另外,所有引擎又在一定程度上決定了Web應(yīng)用的熱度,例如當(dāng)在百度中搜索“鞋”這個(gè)關(guān)鍵字時(shí),如果搜索的結(jié)果中客戶的網(wǎng)站在搜索結(jié)果的后幾頁(yè),用戶通常不會(huì)進(jìn)行翻頁(yè)查詢,相比之下用戶更喜歡在搜索結(jié)果中查看前幾頁(yè)的內(nèi)容。ASP.NET MVC開(kāi)發(fā)模型在用戶進(jìn)行頁(yè)面請(qǐng)求時(shí)會(huì)進(jìn)行URL攔截并通過(guò)相應(yīng)的編程實(shí)現(xiàn)訪問(wèn)路徑和頁(yè)面的呈現(xiàn),這樣就能夠更加方便的實(shí)現(xiàn)目錄形式的頁(yè)面路徑和靜態(tài)形式,對(duì)于Web應(yīng)用動(dòng)態(tài)的地址如abc.aspx?id=1&acti

5、on=add&t=3可以以abc/action/id/add的形式呈現(xiàn),這樣就更加容易的被搜索引擎所搜錄。注意:ASP.NET MVC模型和ASP.NET Web Form并不具備可比性,因?yàn)锳SP.NET MVC模型和ASP.NET Web Form是不同的開(kāi)發(fā)模型,而ASP.NET MVC模型和ASP.NET Web Form在各自的應(yīng)用上都有有點(diǎn)和缺點(diǎn),并沒(méi)有哪個(gè)開(kāi)發(fā)模型比另一個(gè)模型好之說(shuō)。17.1.2 ASP.NET MVC的運(yùn)行結(jié)構(gòu)在ASP.NET MVC開(kāi)發(fā)模型中,頁(yè)面的請(qǐng)求并不是像傳統(tǒng)的Web應(yīng)用開(kāi)發(fā)中的請(qǐng)求一樣是對(duì)某個(gè)文件進(jìn)行訪問(wèn),初學(xué)者可能會(huì)在一開(kāi)始覺(jué)得非常的不適應(yīng)。

6、例如當(dāng)用戶訪問(wèn)/home/abc.aspx時(shí),在服務(wù)器的系統(tǒng)目錄中一定會(huì)存在abc.aspx這個(gè)頁(yè)面,而對(duì)于傳統(tǒng)的頁(yè)面請(qǐng)求的過(guò)程也非常容易理解,因?yàn)樵诜?wù)器上只有存在了home文件夾,在home文件夾下一定存在abc.aspx頁(yè)面才能夠進(jìn)行相應(yīng)的頁(yè)面訪問(wèn)。對(duì)于ASP.NET MVC開(kāi)發(fā)模型而言,當(dāng)請(qǐng)求URL路徑為“”頁(yè)面,而可能是服務(wù)器中某個(gè)方法。在ASP.NET MVC應(yīng)用程序中,頁(yè)面請(qǐng)求的地址不能夠按照傳統(tǒng)的概念進(jìn)行分析,要了解ASP.NET MVC應(yīng)用程序的頁(yè)面請(qǐng)求地址就需要了解ASP.NET MVC開(kāi)發(fā)模型的運(yùn)行結(jié)構(gòu)。ASP.NET MVC開(kāi)發(fā)模型的運(yùn)行結(jié)構(gòu)如圖17-1所示。圖17-1

7、 ASP.NET MVC開(kāi)發(fā)模型正如圖17-1所示,ASP.NET MVC開(kāi)發(fā)模型包括三個(gè)模塊,這三個(gè)模塊分別為MVC的M、V、C,其中M為Models(模型)、V為Views(視圖)、C為Controllers(控制器),在ASP.NET MVC開(kāi)發(fā)模型中,這三個(gè)模塊的作用分別如下所示。q Models:Models負(fù)責(zé)與數(shù)據(jù)庫(kù)進(jìn)行交互,在ASP.NET MVC框架中,使用LINQ進(jìn)行數(shù)據(jù)庫(kù)連接和操作。q Views:Views負(fù)責(zé)頁(yè)面的頁(yè)面呈現(xiàn),包括樣式控制,數(shù)據(jù)的格式化輸出等。q Controllers:Controllers負(fù)責(zé)處理頁(yè)面的請(qǐng)求,用戶呈現(xiàn)相應(yīng)的頁(yè)面。與傳統(tǒng)的頁(yè)面請(qǐng)求和頁(yè)面

8、運(yùn)行方式不同的是,ASP.NET MVC開(kāi)發(fā)模型中的頁(yè)面請(qǐng)求首先會(huì)發(fā)送到Controllers中,Controllers再通過(guò)Models進(jìn)行變量聲明和數(shù)據(jù)讀取。Controller通過(guò)頁(yè)面請(qǐng)求和路由設(shè)置呈現(xiàn)相應(yīng)的View給瀏覽器,用戶就能夠在瀏覽器中看到相應(yīng)的頁(yè)面。這里講解ASP.NET MVC開(kāi)發(fā)模型的工作流程可能會(huì)讓讀者感到困惑,具體ASP.NET MVC開(kāi)發(fā)模型的工作流程會(huì)在后面詳細(xì)講解。17.2 ASP.NET MVC基礎(chǔ)ASP.NET MVC開(kāi)發(fā)模型和ASP.NET Web From開(kāi)發(fā)模型并不相同,ASP.NET MVC為ASP.NET Web開(kāi)發(fā)進(jìn)行了良好的分層,ASP.NET

9、 MVC開(kāi)發(fā)模型和ASP.NET Web From開(kāi)發(fā)模型在請(qǐng)求處理和應(yīng)用上都不盡相同,只有了解ASP.NET Web From開(kāi)發(fā)模型的基礎(chǔ)才能夠高效的開(kāi)發(fā)MVC應(yīng)用程序。 安裝ASP.NET MVCASP.NET MVC是微軟推出的最新的ASP.NET Web開(kāi)發(fā)模型,開(kāi)發(fā)人員可以在微軟的官方網(wǎng)站上下載ASP.NET MVC安裝程序,也能夠使用光盤中附屬的ASP.NET MVC安裝程序進(jìn)行安裝,光盤中附帶的是ASP.NET MVC beta版本,正式版同beta版本基本上沒(méi)有任何區(qū)別,開(kāi)發(fā)人員可以在官方網(wǎng)站下載最新的安裝程序。單擊下載或附錄中的AspNetMVCBeta-setup.msi

10、進(jìn)行ASP.NET MVC開(kāi)發(fā)模型的安裝和相應(yīng)示例的安裝,如圖17-2所示。用戶單擊ASP.NET MVC安裝界面中的【Next】按鈕進(jìn)入ASP.NET MVC安裝的用戶條款界面,單擊【I accept the terms int the License Agreement】復(fù)選框同意ASP.NET MVC用戶條款,如圖17-3所示。同意后單擊【Next】按鈕進(jìn)入ASP.NET MVC安裝準(zhǔn)備界面,進(jìn)入安裝界面后單擊【Install】按鈕進(jìn)行安裝。圖17-2 ASP.NET MVC安裝界面 圖17-3 ASP.NET MVC用戶條款注意:在安裝ASP.NET MVC前必須安裝Visual St

11、udio 2008進(jìn)行ASP.NET MVC應(yīng)用程序的開(kāi)發(fā),安裝完成ASP.NET MVC應(yīng)用程序后就能夠在Visual Studio 2008進(jìn)行創(chuàng)建ASP.NET MVC應(yīng)用程序。單擊【Install】按鈕應(yīng)用程序,系統(tǒng)就會(huì)在計(jì)算機(jī)中安裝ASP.NET MVC開(kāi)發(fā)模型和Visual Studio 2008中進(jìn)行ASP.NET MVC程序開(kāi)發(fā)所需要的必備組件以便在Visual Studio 2008為開(kāi)發(fā)人員提供原生的ASP.NET MVC開(kāi)發(fā)環(huán)境。安裝完畢后,安裝程序會(huì)提示ASP.NET MVC安裝程序已經(jīng)安裝完畢,安裝完畢后開(kāi)發(fā)人員就能夠使用Visual Studio 2008開(kāi)發(fā)ASP

12、.NET MVC應(yīng)用程序。安裝過(guò)程如圖17-4和17-5所示。圖17-4 ASP.NET MVC安裝 圖17-5 ASP.NET MVC安裝完畢新建一個(gè)MVC應(yīng)用程序安裝完成ASP.NET MVC開(kāi)發(fā)模型后就能夠在Visual Studio 2008中創(chuàng)建ASP.NET MVC應(yīng)用程序進(jìn)行ASP.NET MVC應(yīng)用程序的開(kāi)發(fā),安裝ASP.NET MVC開(kāi)發(fā)模型后,Visual Studio 2008就能夠?yàn)锳SP.NET MVC提供原生的開(kāi)發(fā)環(huán)境。在菜單欄中選擇【文件】選項(xiàng),單擊【文件】選項(xiàng)在下拉菜單中選擇【新建項(xiàng)目】就能夠創(chuàng)建ASP.NET MVC應(yīng)用程序,如圖17-6所示。單擊【確定】按鈕

13、后就能夠創(chuàng)建ASP.NET MVC應(yīng)用程序。Visual Studio 2008為ASP.NET MVC提供了原生的開(kāi)發(fā)環(huán)境,以及智能提示,開(kāi)發(fā)人員在進(jìn)行ASP.NET MVC應(yīng)用程序開(kāi)發(fā)中,Visual Studio 2008同樣能夠?yàn)锳SP.NET MVC應(yīng)用程序提供關(guān)鍵字自動(dòng)補(bǔ)完、智能解析等功能以便開(kāi)發(fā)人員高效的進(jìn)行ASP.NET MVC應(yīng)用程序的開(kāi)發(fā)。創(chuàng)建ASP.NET MVC應(yīng)用程序后,系統(tǒng)會(huì)自動(dòng)創(chuàng)建若干文件夾和文件,如圖17-7所示。圖17-6 創(chuàng)建ASP.NET MVC應(yīng)用程序 圖17-7 自動(dòng)創(chuàng)建的文件在自動(dòng)創(chuàng)建的文件中,這些文件包括ASP.NET MVC應(yīng)用程序中最重要的文件

14、夾用于分層開(kāi)發(fā),這些文件夾分別為Models、Views和Controllers,分別對(duì)應(yīng)ASP.NET MVC開(kāi)發(fā)模型的Models(模型)、Views(視圖)、Controller(控制器),開(kāi)發(fā)人員能夠在相應(yīng)的文件夾中創(chuàng)建文件進(jìn)行ASP.NET MVC應(yīng)用程序的開(kāi)發(fā)。17.2.3 ASP.NET MVC應(yīng)用程序的結(jié)構(gòu)在創(chuàng)建完成ASP.NET MVC應(yīng)用程序,系統(tǒng)會(huì)默認(rèn)創(chuàng)建一些文件夾,這些文件夾不僅包括對(duì)應(yīng)ASP.NET MVC開(kāi)發(fā)模型的Models、Views和Controllers文件夾,還包括配置文件Web.config、Global.aspx和Default.aspx。1:頁(yè)面驅(qū)動(dòng)

15、Default.aspx用于ASP.NET MVC應(yīng)用程序程序的驅(qū)動(dòng),當(dāng)用戶執(zhí)行相應(yīng)的請(qǐng)求時(shí),Default.aspx能夠驅(qū)動(dòng)ASP.NET MVC應(yīng)用程序頁(yè)面的處理和生成,Default.aspx頁(yè)面代碼如下所示。<% Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_17_1._Default" %>。IHttpHandler類獲取和發(fā)送HTTP請(qǐng)求,Default.aspx.cs頁(yè)面代

16、碼如下所示。using System.Web;using System.Web.Mvc;/使用Mvc命名空間using System.Web.UI;namespace _17_1 public partial class _Default : Page public void Page_Load(object sender, System.EventArgs e) plicationPath);/攔截虛擬目錄根路徑 IHttpHandler httpHandler = new MvcHttpHandler(); httpHandler.ProcessRequest(HttpContext.Cu

17、rrent); 上述代碼用于ASP.NET MVC應(yīng)用程序的驅(qū)動(dòng)。在ASP.NET MVC應(yīng)用程序被運(yùn)行時(shí),會(huì)攔截虛擬目錄的根路徑將請(qǐng)求發(fā)送到Controllers實(shí)現(xiàn)。2Global.asax:全局配置文件是全局配置文件,在ASP.NET MVC應(yīng)用程序中的應(yīng)用程序路徑是通過(guò)Global.asax文件進(jìn)行配置和實(shí)現(xiàn)的,頁(yè)面代碼如下所示。using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;/使用Mvc命名空間using ;/使用Mvc命名空間n

18、amespace _17_1 / Note: For instructions on enabling IIS6 or IIS7 classic mode, public static void RegisterRoutes(RouteCollection routes) routes.IgnoreRoute("resource.axd/*pathInfo"); routes.MapRoute( "Default",/配置路由名稱 "controller/action/id",/配置訪問(wèn)規(guī)則 new controller = &quo

19、t;Home", action = "Index", id = "" /為訪問(wèn)規(guī)則配置默認(rèn)值 );/配置URL路由 protected void Application_Start() RegisterRoutes(RouteTable.Routes); 上述代碼在應(yīng)用程序運(yùn)行后能夠?qū)崿F(xiàn)相應(yīng)的URL映射,當(dāng)用戶請(qǐng)求一個(gè)頁(yè)面時(shí),該頁(yè)面會(huì)在運(yùn)行時(shí)啟動(dòng)并指定ASP.NET MVC應(yīng)用程序中URL的映射以便將請(qǐng)求提交到Controllers進(jìn)行相應(yīng)的編程處理和頁(yè)面呈現(xiàn)。實(shí)現(xiàn)了偽靜態(tài)的URL配置,例如當(dāng)用戶訪問(wèn)/home/guestbook/number

20、服務(wù)器路徑時(shí),通過(guò)URLRouting夠?qū)崿F(xiàn)服務(wù)器路徑/home/guestbook/number到number.aspx的映射。有關(guān)URLRouting的知識(shí)會(huì)在后面的小結(jié)中講解。注意:在ASP.NET MVC開(kāi)發(fā)模型中,瀏覽器地址欄的URL并不能夠被稱為是偽靜態(tài),為了方便讀者的理解可以暫時(shí)稱為偽靜態(tài),但是最主要的是要理解訪問(wèn)的路徑并不像傳統(tǒng)的Web開(kāi)發(fā)中那樣是訪問(wèn)真實(shí)的某個(gè)文件。3Models、Views和Controllers三層結(jié)構(gòu)Models、Views和Controllers文件夾是ASP.NET MVC開(kāi)發(fā)模型中最為重要的文件夾,雖然這里以文件夾的形式呈現(xiàn)在解決方案管理器中,其實(shí)

21、并不能看作傳統(tǒng)的文件夾。Models、Views和Controllers分別用于存放ASP.NET MVC應(yīng)用程序中Models、Views和Controllers的開(kāi)發(fā)文件。在創(chuàng)建ASP.NET MVC應(yīng)用程序后,系統(tǒng)會(huì)自行創(chuàng)建相應(yīng)的文件,這里也包括ASP.NET MVC應(yīng)用程序樣例,如圖17-8和圖17-9所示。圖17-8 Views視圖文件夾 圖17-9 Controllers控制器文件夾正如圖17-8、17-9所示,在樣例中分別創(chuàng)建了若干Controllers控制器文件,以及Views頁(yè)面文件。運(yùn)行ASP.NET MVC應(yīng)用程序后,用戶的請(qǐng)求會(huì)發(fā)送到Controllers控制器中,Co

22、ntrollers控制器接受用戶的請(qǐng)求并通過(guò)編程實(shí)現(xiàn)Views頁(yè)面文件的映射。運(yùn)行ASP.NET MVC應(yīng)用程序創(chuàng)建ASP.NET MVC應(yīng)用程序后就能夠直接運(yùn)行ASP.NET MVC應(yīng)用程序,默認(rèn)的ASP.NET MVC應(yīng)用程序已經(jīng)提供了樣例方便開(kāi)發(fā)人員進(jìn)行編程學(xué)習(xí),單擊【F5】運(yùn)行ASP.NET MVC應(yīng)用程序,運(yùn)行后如圖17-10所示。在創(chuàng)建ASP.NET MVC應(yīng)用程序后系統(tǒng)會(huì)創(chuàng)建樣例,圖17-10顯式的就是ASP.NET MVC默認(rèn)運(yùn)行界面,單擊旁邊的【About Us】連接頁(yè)面跳轉(zhuǎn)到相應(yīng)的頁(yè)面,如圖17-11所示。圖17-10 ASP.NET MVC應(yīng)用程序初始界面 圖17-11

23、About頁(yè)面當(dāng)單擊【About Us】鏈接后,頁(yè)面會(huì)跳轉(zhuǎn)到關(guān)于頁(yè)面,頁(yè)面URL為http:/localhost:2448/Home/About。在ASP.NET MVC應(yīng)用程序中,URL路徑的請(qǐng)求方式與傳統(tǒng)的ASP.NET Web Form應(yīng)用程序不同,開(kāi)發(fā)人員可以發(fā)現(xiàn),在服務(wù)器文件中并沒(méi)有/Home/About/index.aspx文件也沒(méi)有/Home/About/這個(gè)目錄。注意:在ASP.NET MVC應(yīng)用程序中,這里再三強(qiáng)調(diào),其URL并不是服務(wù)器中的某個(gè)文件而是一種地址映射。在服務(wù)器中沒(méi)有/Home/About/index.aspx文件也沒(méi)有/Home/About/這個(gè)目錄,因?yàn)?Ho

24、me/About中所呈現(xiàn)的頁(yè)面是通過(guò)Controller控制器進(jìn)行相應(yīng)的文件的路徑的映射的,關(guān)于地址映射的內(nèi)容會(huì)在后面的小結(jié)中詳細(xì)講解。17.3 ASP.NET MVC原理運(yùn)行了ASP.NET MVC應(yīng)用程序后,就能夠通過(guò)相應(yīng)的地址訪問(wèn)不同的頁(yè)面。在ASP.NET MVC應(yīng)用程序中,應(yīng)用程序中頁(yè)面的URL并不是在服務(wù)器中實(shí)際存在的頁(yè)面或目錄而是訪問(wèn)了相應(yīng)的方法s實(shí)現(xiàn)了URL映射。17.3.1 ASP.NET MVC運(yùn)行流程。同樣當(dāng)訪問(wèn)相應(yīng)的ASP.NET MVC應(yīng)用程序頁(yè)面,在服務(wù)器中并不存在對(duì)應(yīng)的頁(yè)面。為了了解如何實(shí)現(xiàn)頁(yè)面映射,就需要了解ASP.NET MVC應(yīng)用程序的運(yùn)行流程。s實(shí)現(xiàn)了UR

25、L映射。當(dāng)用戶進(jìn)行ASP.NET MVC程序的頁(yè)面請(qǐng)求時(shí),該請(qǐng)求首先會(huì)會(huì)被發(fā)送到Controllers控制器中,開(kāi)發(fā)人員能夠在控制器Controllers中創(chuàng)建相應(yīng)的變量并將請(qǐng)求發(fā)送到Views視圖中,Views視圖會(huì)使用在Controllers控制器中通過(guò)編程方式創(chuàng)建相應(yīng)的變量并呈現(xiàn)頁(yè)面在瀏覽器中。當(dāng)用戶在瀏覽器中對(duì)Web應(yīng)用進(jìn)行不同的頁(yè)面請(qǐng)求時(shí),該運(yùn)行過(guò)程將會(huì)循環(huán)反復(fù)。對(duì)于Models而言,Controller通常情況下使用Models讀取數(shù)據(jù)庫(kù)。在Models中,Models能夠?qū)鹘y(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)映射成面向?qū)ο蟮拈_(kāi)發(fā)模型,開(kāi)發(fā)人員能夠使用面向?qū)ο蟮乃枷脒M(jìn)行數(shù)據(jù)庫(kù)的數(shù)據(jù)存取。Contro

26、llers從Model中讀取數(shù)據(jù)并存儲(chǔ)在相應(yīng)的變量中,如圖17-12所示。圖17-12 ASP.NET MVC運(yùn)行流程正如圖17-12所示,在用戶進(jìn)行頁(yè)面請(qǐng)求時(shí),首先這個(gè)請(qǐng)求會(huì)發(fā)送到Controllers中,Controllers從Models中讀取相應(yīng)的數(shù)據(jù)并填充Controllers中的變量,Controllers接受相應(yīng)請(qǐng)求再將請(qǐng)求發(fā)送到Views中,Views通過(guò)獲取Controllers中的變量的值進(jìn)行整合并生成相應(yīng)的頁(yè)面到用戶瀏覽器中。在Models中需要將數(shù)據(jù)庫(kù)抽象成面向?qū)ο笾械囊粋€(gè)對(duì)象,開(kāi)發(fā)人員能夠使用LINQ進(jìn)行數(shù)據(jù)庫(kù)的抽象,這樣就能夠方便的將數(shù)據(jù)庫(kù)中的數(shù)據(jù)抽象成相應(yīng)的對(duì)象并

27、通過(guò)對(duì)象的方法進(jìn)行數(shù)據(jù)的存取和更新。17.3.2 ASP.NET MVC工作原理正如上一節(jié)中講解的ASP.NET MVC工作流程,在ASP.NET MVC應(yīng)用程序中,系統(tǒng)默認(rèn)創(chuàng)建了相應(yīng)的文件夾進(jìn)行不同層次的開(kāi)發(fā),在ASP.NET MVC應(yīng)用程序的運(yùn)行過(guò)程中,同樣請(qǐng)求會(huì)發(fā)送到Controllers中,這樣就對(duì)應(yīng)了ASP.NET MVC應(yīng)用程序中的Controllers文件夾,Controllers只負(fù)責(zé)數(shù)據(jù)的讀取和頁(yè)面邏輯的處理。在Controllers讀取數(shù)據(jù)時(shí),需要通過(guò)Models中的LINQ to SQL從數(shù)據(jù)中讀取相應(yīng)的信息,讀取數(shù)據(jù)完畢后,Controllers再將數(shù)據(jù)和Control

28、ler整合并提交到Views視圖中,整合后的頁(yè)面將通過(guò)瀏覽器呈現(xiàn)在用戶面前。當(dāng)用戶訪問(wèn)http:/localhost:2448/Home/About頁(yè)面時(shí),首先這個(gè)請(qǐng)求會(huì)發(fā)送到Controllers中,Controllers通過(guò)Global.ascx文件中的路由設(shè)置進(jìn)行相應(yīng)的URL映射,Global.ascx文件相應(yīng)代碼如下所示。 public static void RegisterRoutes(RouteCollection routes)/注冊(cè)路由 routes.IgnoreRoute("resource.axd/*pathInfo"); routes.MapRout

29、e( "Default", "controller/action/id", new controller = "Home", action = "Index", id = "" /配置路由 ); 上述代碼中實(shí)現(xiàn)了映射操作,具體是如何實(shí)現(xiàn)可以先無(wú)需關(guān)心,首先需要看看Controllers文件夾內(nèi)的文件,以及Views文件夾的文件,如圖17-13所示。圖17-13 Controller文件夾和Views文件夾從圖17-13中可以看出,在Views中包含Home文件夾,在Home文件夾中存在About

30、.aspx和Index.aspx文件,而同樣在Controllers文件夾中包含與Home文件夾同名的文件。當(dāng)用戶訪問(wèn)st:2448/Home/About路徑時(shí),首先該路徑請(qǐng)求會(huì)傳送到Controller中。注意:在Controllers文件夾中創(chuàng)建文件同Home是同名文件,在Controllers中創(chuàng)建的文件,其文件名后的是不能更改的,所以文件也可以看做是Home文件夾的同名文件。在Controller中,Controller通過(guò)相應(yīng)的編程實(shí)現(xiàn)路徑的映射,示例代碼如下所示。 HandleError public class HomeController : Controller public

31、 ActionResult About()/實(shí)現(xiàn)About頁(yè)面 ViewData"Title" = "About Page" return View();/返回視圖 上述代碼實(shí)現(xiàn)了About頁(yè)面的頁(yè)面呈現(xiàn),在運(yùn)行相應(yīng)的方法后會(huì)返回一個(gè)View,這里默認(rèn)返回的是與Home的About方法同名的頁(yè)面,這里是about.aspx,about.aspx頁(yè)面代碼如下所示。<% Page Language="C#" MasterPageFile="/Views/Shared/Site.Master" AutoEventW

32、ireup="true" CodeBehind="About.aspx.cs" Inherits="_17_1.Views.Home.About" %><asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server"> <h2>About Us</h2> <p> TODO: Put <em>about</em&

33、gt; content here. </p></asp:Content>將about.aspx頁(yè)面中的文字進(jìn)行相應(yīng)的更改,示例代碼如下所示。<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server"> <h2>About Us</h2> <p><span style=”color:red”>這是一個(gè)關(guān)于頁(yè)面</span> </p>

34、;</asp:Content>運(yùn)行about.aspx頁(yè)面,運(yùn)行后如圖17-14所示。圖17-14 修改后的About Us頁(yè)面從上述代碼可以看出,Controllers與Global.ascx用于URL的映射,而Views用于頁(yè)面的呈現(xiàn)。從這里可以看出,當(dāng)用戶訪問(wèn)http:/localhost:2448/Home/About頁(yè)面時(shí),訪問(wèn)的并不是服務(wù)器中的/Home/About頁(yè)面,而訪問(wèn)的是Controllers中的HomeControllers的About方法。注意:ASP.NET MVC應(yīng)用程序中的URL路徑訪問(wèn)的并不是一個(gè)頁(yè)面,而是一個(gè)方法,例如訪問(wèn)/Home/About頁(yè)

35、面就是訪問(wèn)的是HomeControllers中的About方法,而訪問(wèn)/Account/Login頁(yè)面就是訪問(wèn)的是AccountControllers中的Login方法。在ASP.NET MVC應(yīng)用程序中,ASP.NET MVC應(yīng)用程序的對(duì)應(yīng)關(guān)系如圖17-15所示。圖17-15 ASP.NET MVC應(yīng)用程序關(guān)系圖在ASP.NET MVC應(yīng)用程序中,HomeController.cs對(duì)應(yīng)Views的Home文件夾,而其中的Index方法和About方法對(duì)應(yīng)Index.aspx文件和About.aspx文件。,而訪問(wèn)路徑為XXX/YYY是訪問(wèn)的是XXXController.cs中的YYY()方法

36、。實(shí)現(xiàn)相應(yīng)的URL映射需要通過(guò)修改Global.ascx文件進(jìn)行實(shí)現(xiàn),如何通過(guò)修改Global.ascx文件進(jìn)行不同的URL映射將在后面的小結(jié)中講解。17.4 ASP.NET MVC開(kāi)發(fā)在了解了ASP.NET MVC工作原理和工作流程,以及ASP.NET MVC中的URL映射基礎(chǔ)原理,就能夠進(jìn)行ASP.NET MVC應(yīng)用程序的開(kāi)發(fā),在進(jìn)行ASP.NET MVC應(yīng)用程序開(kāi)發(fā)的過(guò)程中可以深入的了解ASP.NET MVC應(yīng)用程序模型和URL映射原理。創(chuàng)建ASP.NET MVC頁(yè)面ASP.NET MVC應(yīng)用程序包括MVC三個(gè)部分,其中Models是用于進(jìn)行數(shù)據(jù)庫(kù)抽象,Views是用于進(jìn)行視圖的呈現(xiàn)而C

37、ontrollers是用于控制器和邏輯處理,在創(chuàng)建ASP.NET MVC應(yīng)用程序時(shí),可以為ASP.NET MVC應(yīng)用程序分別創(chuàng)建相應(yīng)的文件。首先在Views文件夾中創(chuàng)建一個(gè)文件夾,這里創(chuàng)建一個(gè)Beta文件夾。創(chuàng)建文件夾后單擊Beta文件夾,右擊文件夾,在下拉菜單中選擇【添加】選項(xiàng),在【添加】選項(xiàng)中單擊【新建項(xiàng)】選項(xiàng),單擊后系統(tǒng)會(huì)彈出對(duì)話框用于View文件的創(chuàng)建,如圖17-16所示。圖17-16 創(chuàng)建View文件在Views中可以創(chuàng)建MVC View Page用于Views文件的創(chuàng)建,從而用于在ASP.NET MVC應(yīng)用程序中中可以編寫相應(yīng)的代碼用于視圖的呈現(xiàn),Index.aspx頁(yè)面代碼如下所

38、示。<% Page Language="C#" AutoEventWireup="true" CodeBehind="Beta.aspx.cs" Inherits="_17_1.Views.Beta.Beta" %><h2>About Us</h2><p> <span style="color:red">這是一個(gè)測(cè)試頁(yè)面</span></p>Index.aspx頁(yè)面用于視圖的呈現(xiàn),在中,的,而ASP.NET MV

39、C應(yīng)用程序頁(yè)面代碼需要派生自ViewPage,示例頁(yè)面代碼如下所示。using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;/使用MVC命名空間 public partial class Index : ViewPage/派生自ViewPage 在完成Beta.aspx的創(chuàng)建后,在ASP.NET MVC應(yīng)用程序開(kāi)發(fā)模型中還需要?jiǎng)?chuàng)建Controllers用于接受用戶請(qǐng)求和Beta.aspx頁(yè)面同名的方法實(shí)現(xiàn)。單擊Controllers文件夾,右擊Co

40、ntrollers文件夾,在下拉菜單中選擇【添加】選項(xiàng),在【添加】選項(xiàng)中單擊【新建項(xiàng)】選項(xiàng)。這里可以創(chuàng)建一個(gè)同名的類文件,如圖17-17所示。圖17-17 創(chuàng)建Controllers文件創(chuàng)建Controllers類文件時(shí),創(chuàng)面的類文件的名稱必須為Views文件夾中相應(yīng)的視圖文件夾的名稱加上Controllers.cs,正如圖17-17所示,如創(chuàng)建的是“Beta”文件夾,在創(chuàng)建Controllers時(shí)必須創(chuàng)建BetaControllers.cs,在創(chuàng)建相應(yīng)的類文件后才能夠攔截相應(yīng)的URL并進(jìn)行地址映射,創(chuàng)建后的Controllers類文件代碼如下所示。using System;using Sys

41、tem.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;/使用MVC命名空間using System.Web.Mvc.Ajax;/使用MVC命名空間 HandleError public class BetaController : Controller public ActionResult Index()/實(shí)現(xiàn)Index方法 return View();/返回Index視圖 頁(yè)面的訪問(wèn)。Views中的。單擊【F5】運(yùn)行頁(yè)面,運(yùn)行后如圖17-18所示。圖17-18 MVC頁(yè)面運(yùn)行這里講解了

42、如何手動(dòng)創(chuàng)建ASP.NET MVC頁(yè)面。在某些版本的Visual Studio中,安裝了ASP.NET MVC開(kāi)發(fā)包應(yīng)用程序后,可能不會(huì)存在MVC文件的創(chuàng)建,這時(shí)只能通過(guò)創(chuàng)建ASP.NET Web Form再通過(guò)編碼實(shí)現(xiàn)。如果希望能夠創(chuàng)建ASP.NET MVC模板而不使用手動(dòng)創(chuàng)建可以在C:Program FilesMicrosoft ASP.NETASP.NET MVC BetaTemp目錄下將壓縮包拷貝到相應(yīng)的Visual Studio安裝目錄X:Microsoft Visual Studio 9.0Common7IDEItemTemplatesCSharpWeb2052中,拷貝后在開(kāi)始菜單

43、中選擇“運(yùn)行”,在窗口中輸入cmd,就會(huì)彈出一個(gè)黑色的命令行窗口,在命令行輸入cd X:Microsoft Visual Studio 9.0Common7IDEItemTemplatesCSharpWeb2052進(jìn)入目錄,輸入devenv.exe /setup進(jìn)行模板的安裝,安裝完成后就能夠在添加新項(xiàng)中選擇MVC應(yīng)用程序模板。17.4.2 ASP.NET MVC 數(shù)據(jù)呈現(xiàn)(ViewData)在ASP.NET MVC應(yīng)用程序中,Controllers負(fù)責(zé)數(shù)據(jù)的讀取而Views負(fù)責(zé)界面的呈現(xiàn),在界面的呈現(xiàn)中Views通常不進(jìn)行數(shù)據(jù)的讀取和邏輯運(yùn)算,數(shù)據(jù)的讀取和邏輯運(yùn)算都交付給Controller

44、s負(fù)責(zé)。為了能夠方便的將Controllers與Views進(jìn)行整合并在Views中呈現(xiàn)Controllers中的變量,可以使用ViewData整合Controllers與Views從而進(jìn)行數(shù)據(jù)讀取和顯示。在ASP.NET MVC應(yīng)用程序的Views中,其值并不是固定的,而是通過(guò)Controllers傳遞過(guò)來(lái)的,在Controllers類文件中的頁(yè)面實(shí)現(xiàn)代碼中,可以需要使用ViewData進(jìn)行值的傳遞,BetaControllers.cs中Index.aspx實(shí)現(xiàn)的Index()的方法示例代碼如下所示。 HandleError public class BetaController : Cont

45、roller public ActionResult Index()/實(shí)現(xiàn)Index方法 ViewData"beta" = "這是一個(gè)ViewData字符串"/使用ViewData return View();/返回視圖 上述代碼使用ViewData存儲(chǔ)數(shù)據(jù),ViewData的聲明和賦值方式與Session對(duì)象相同,直接通過(guò)編寫ViewData鍵值的名稱=XXX進(jìn)行相應(yīng)的鍵值的賦值。如果需要在頁(yè)面中進(jìn)行相應(yīng)的值的呈現(xiàn),只需要輸出ViewData鍵值的名稱即可。在ASP.NET MVC應(yīng)用程序中,字符輸出都需要呈現(xiàn)在Views視圖中,在Controller

46、s中進(jìn)行ViewData變量的賦值,就需要在Views中輸出相應(yīng)的變量,BetaControllers.cs中的Index()方法實(shí)現(xiàn)的是Index.aspx頁(yè)面,在Index.aspx可以使用ViewData"beta"變量,示例代碼如下所示。<h2>About Us</h2><p> <span style="color:Red">這是一個(gè)測(cè)試頁(yè)面</span><br/> <span style="color:Green"><%=ViewDat

47、a"beta" %></span></p>上述代碼中在運(yùn)行后會(huì)輸出ViewData"beta"變量中存儲(chǔ)的值,運(yùn)行后如圖17-19所示。圖17-19 輸出ViewDataViewData不僅可以為某個(gè)具體的值,ViewData還可以是一個(gè)泛型變量,示例代碼如下所示。 HandleError public class BetaController : Controller public ActionResult Index() List<string> str = new List<string>();

48、/創(chuàng)建泛型變量 str.Add("str字符串1<hr/>");/添加成員 str.Add("str字符串2<hr/>");/添加成員 str.Add("str字符串3<hr/>");/添加成員 str.Add("str字符串4<hr/>");/添加成員 ViewData"beta" = str;/賦值ViewData return View();/返回視圖 在為ViewData賦值泛型變量后,在相應(yīng)的View頁(yè)面中也可以輸出ViewData的值,

49、示例代碼如下所示。<h2>About Us</h2><p> <span style="color:Red">這是一個(gè)測(cè)試頁(yè)面</span><br/> <% foreach(string str in ViewData"beta" as List<string>) %> <% = str%></p>上述代碼通過(guò)使用foreach進(jìn)行ViewData變量中相應(yīng)健值的值的遍歷,運(yùn)行后如圖17-20所示。圖17-20 遍歷ViewData變量的

50、值使用List類能夠?qū)?shù)據(jù)庫(kù)中的數(shù)據(jù)存放在泛型列表類中,開(kāi)發(fā)人員能夠?qū)?shù)據(jù)庫(kù)中的數(shù)據(jù)遍歷并存放在Controllers類文件中的頁(yè)面實(shí)現(xiàn)的類的ViewData變量中,當(dāng)需要遍歷數(shù)據(jù)進(jìn)行呈現(xiàn)時(shí),例如新聞列表或者是論壇列表等,可以通過(guò)遍歷ViewData變量的值遍歷輸出數(shù)據(jù)庫(kù)中的數(shù)據(jù)。17.4.3 ASP.NET MVC 跨頁(yè)數(shù)據(jù)呈現(xiàn)(TempData)ASP.NET MVC TempData同ASP.NET MVC ViewData一樣,是在Controllers中聲明的變量以便在Views中進(jìn)行調(diào)用,示例代碼如下所示。 HandleError public class BetaControll

51、er : Controller public ActionResult Index() TempData"beta" = "TempData字符串" return View(); 上述代碼在Controllers中聲明了TempData,在Views中的相應(yīng)頁(yè)面可以使用此TempData進(jìn)行變量的輸出,示例代碼如下所示。<% Page Language="C#" AutoEventWireup="true" CodeBehind="Beta.aspx.cs" Inherits="

52、_17_1.Views.Beta.Index" %><h2>About Us</h2><p> <%=TempData"beta" %></p>上述代碼呈現(xiàn)了TempData變量的值,運(yùn)行后如圖17-21所示。圖17-21 顯示TempData變量在數(shù)據(jù)呈現(xiàn)上,TempData變量同ASP.NET MVC ViewData基本相同,但是TempData能夠在跳轉(zhuǎn)中保存值。當(dāng)用戶訪問(wèn)一個(gè)頁(yè)面時(shí),該頁(yè)面的Controllers中包含TempData變量。當(dāng)這個(gè)頁(yè)面通過(guò)Redirect跳轉(zhuǎn)到另一個(gè)頁(yè)面時(shí),另

53、一個(gè)頁(yè)面能夠使用跳轉(zhuǎn)頁(yè)面的TempData變量。在跳轉(zhuǎn)頁(yè)面中,在跳轉(zhuǎn)前可以編寫TempData變量保存相應(yīng)的值,示例代碼如下所示。 HandleError public class BetaController : Controller public ActionResult Index() TempData"Index" = "這是跳轉(zhuǎn)頁(yè)面的字符串哦."/編寫TempData Response.Redirect("/Beta/Get");/頁(yè)面跳轉(zhuǎn) return View();/返回視圖 上述忽代碼編寫了一個(gè)TempDataTemp

54、Data變量的值。創(chuàng)建完成后,編寫HTML代碼如下所示。<% Page Language="C#" AutoEventWireup="true" CodeBehind="Get.aspx.cs" Inherits="_17_1.Views.Beta.Get" %><h2>接受傳遞的參數(shù)</h2><p> <%=TempData"Index" %></p>編寫了頁(yè)面代碼后還不能對(duì)頁(yè)面進(jìn)行訪問(wèn),由于MVC編程模型中路徑是訪問(wèn)的Co

55、ntroller中的方法,所以還需要在Controller中實(shí)現(xiàn)Get頁(yè)面的方法,示例代碼如下所示。 public ActionResult Get() return View();/返回默認(rèn)視圖 上述代碼返回默認(rèn)視圖,當(dāng)不給頁(yè)面文件。這里沒(méi)有對(duì)View方法傳遞參數(shù),則返回的是Get.aspx頁(yè)面視圖,當(dāng)用戶訪問(wèn)/Beta/路徑時(shí),代碼會(huì)創(chuàng)建一個(gè)TempData變量并跳轉(zhuǎn)到/Beta/Get路徑,在/Beta/Get路徑相應(yīng)的文件中可以獲取跳轉(zhuǎn)前的TempData變量的值,運(yùn)行后如圖17-22所示。圖17-22 接受TempData變量的值TempData變量,而是在跳轉(zhuǎn)前的頁(yè)面中聲明的TempData變量,與ViewData相比跳轉(zhuǎn)后的頁(yè)面能夠獲取TempData變量的值而不能獲取ViewData的值,這在某些應(yīng)用場(chǎng)合如拋出異常等情況下非常適用。注意:TempData變量在跳轉(zhuǎn)中能夠跨頁(yè)面進(jìn)行數(shù)據(jù)讀取,但是跨頁(yè)面跳轉(zhuǎn)后TempData變量只能呈現(xiàn)一次。簡(jiǎn)單的說(shuō)就是跳轉(zhuǎn)的第一次能過(guò)獲取跳轉(zhuǎn)前頁(yè)面的TempData變量的值,而再次操作時(shí)就無(wú)法使用跳轉(zhuǎn)前頁(yè)面的TempData變量值。17.4.4 ASP.NET MVC頁(yè)面重定向在ASP.NET Web Form中,可以通過(guò)R

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論