版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、應(yīng)用程序開發(fā)中,例如頁面代碼只進(jìn)行頁面布局和樣式的輸出而代碼頁面只負(fù)責(zé)進(jìn)行邏輯的處理。為了解決這個問題,微軟開發(fā)了MVC開發(fā)模式方便開發(fā)人員進(jìn)行分層開發(fā)。17.1 了解MVCMVC是一個設(shè)計模式,MVC能夠?qū)SP.NET應(yīng)用程序的視圖、模型和控制器進(jìn)行分開,開發(fā)人員能夠在不同的層次中進(jìn)行應(yīng)用程序?qū)哟蔚拈_發(fā),例如開發(fā)人員能夠在視圖中進(jìn)行頁面視圖的開發(fā),而在控制器中進(jìn)行代碼的實現(xiàn)。 MVC和Web Form在ASP.NET Web Form的開發(fā)當(dāng)中,用戶能夠方便的使用微軟提供的服務(wù)器控件進(jìn)行應(yīng)用程序的開發(fā),從而提高開發(fā)效率。雖然ASP.NET Web Form提高了開發(fā)速度、維護(hù)效率和代碼的復(fù)
2、用性,但是拋棄了傳統(tǒng)的網(wǎng)頁編程模型,在很多應(yīng)用問題的解決上反而需要通過復(fù)雜的實現(xiàn)完成。在ASP.NET MVC模型中,ASP.NET MVC模型給開發(fā)人員的感覺仿佛又回到了傳統(tǒng)的網(wǎng)頁編程模型中(如ASP編程模型),但是ASP.NET MVC模型與傳統(tǒng)的ASP同樣是不同的編程模型,因為ASP.NET MVC模型同樣是基于面向?qū)ο蟮乃枷脒M(jìn)行應(yīng)用程序的開發(fā)。相比之下,ASP.NET MVC模型是一種思想,而不是一個框架,所以ASP.NET MVC模型與ASP.NET Web Form并不具有可比性。同樣ASP.NET MVC模型也不是ASP.NET Web Form 4.0,這兩個開發(fā)模型就好比一個
3、是汽車一個是飛機,而兩者都能夠達(dá)到同樣的目的。應(yīng)用程序一樣。當(dāng)用戶通過瀏覽器請求服務(wù)器中的某個頁面時,其實是實現(xiàn)了ASP.NET MVC模型中的一個方法,而不是具體的頁面,這在另一種程度上實現(xiàn)了URL偽靜態(tài)。當(dāng)用戶通過瀏覽器請求服務(wù)器中的某一個路徑時,ASP.NET MVC應(yīng)用程序會攔截相應(yīng)的地址并進(jìn)行路由解析,通過應(yīng)用程序中編程實現(xiàn)展現(xiàn)一個頁面給用戶,這種頁面展現(xiàn)手法同傳統(tǒng)的ASP.NET Web From應(yīng)用程序與其他的如ASP,PHP等應(yīng)用程序都不相同。同時,隨著互聯(lián)網(wǎng)的發(fā)展,搜索引擎在Web開發(fā)中起著重要的作用,這就對頁面請求的地址有了更加嚴(yán)格的要求。例如百度、谷歌等搜索引擎會對目錄形
4、式的頁面路徑和靜態(tài)形式的頁面路徑收錄的更好,而對于動態(tài)的如abc.aspx?id=1&action=add&t=3這種樣式的頁面路徑不甚友好。另外,所有引擎又在一定程度上決定了Web應(yīng)用的熱度,例如當(dāng)在百度中搜索“鞋”這個關(guān)鍵字時,如果搜索的結(jié)果中客戶的網(wǎng)站在搜索結(jié)果的后幾頁,用戶通常不會進(jìn)行翻頁查詢,相比之下用戶更喜歡在搜索結(jié)果中查看前幾頁的內(nèi)容。ASP.NET MVC開發(fā)模型在用戶進(jìn)行頁面請求時會進(jìn)行URL攔截并通過相應(yīng)的編程實現(xiàn)訪問路徑和頁面的呈現(xiàn),這樣就能夠更加方便的實現(xiàn)目錄形式的頁面路徑和靜態(tài)形式,對于Web應(yī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并不具備可比性,因為ASP.NET MVC模型和ASP.NET Web Form是不同的開發(fā)模型,而ASP.NET MVC模型和ASP.NET Web Form在各自的應(yīng)用上都有有點和缺點,并沒有哪個開發(fā)模型比另一個模型好之說。17.1.2 ASP.NET MVC的運行結(jié)構(gòu)在ASP.NET MVC開發(fā)模型中,頁面的請求并不是像傳統(tǒng)的Web應(yīng)用開發(fā)中的請求一樣是對某個文件進(jìn)行訪問,初學(xué)者可能會在一開始覺得非常的不適應(yīng)。
6、例如當(dāng)用戶訪問/home/abc.aspx時,在服務(wù)器的系統(tǒng)目錄中一定會存在abc.aspx這個頁面,而對于傳統(tǒng)的頁面請求的過程也非常容易理解,因為在服務(wù)器上只有存在了home文件夾,在home文件夾下一定存在abc.aspx頁面才能夠進(jìn)行相應(yīng)的頁面訪問。對于ASP.NET MVC開發(fā)模型而言,當(dāng)請求URL路徑為“”頁面,而可能是服務(wù)器中某個方法。在ASP.NET MVC應(yīng)用程序中,頁面請求的地址不能夠按照傳統(tǒng)的概念進(jìn)行分析,要了解ASP.NET MVC應(yīng)用程序的頁面請求地址就需要了解ASP.NET MVC開發(fā)模型的運行結(jié)構(gòu)。ASP.NET MVC開發(fā)模型的運行結(jié)構(gòu)如圖17-1所示。圖17-1
7、 ASP.NET MVC開發(fā)模型正如圖17-1所示,ASP.NET MVC開發(fā)模型包括三個模塊,這三個模塊分別為MVC的M、V、C,其中M為Models(模型)、V為Views(視圖)、C為Controllers(控制器),在ASP.NET MVC開發(fā)模型中,這三個模塊的作用分別如下所示。q Models:Models負(fù)責(zé)與數(shù)據(jù)庫進(jìn)行交互,在ASP.NET MVC框架中,使用LINQ進(jìn)行數(shù)據(jù)庫連接和操作。q Views:Views負(fù)責(zé)頁面的頁面呈現(xiàn),包括樣式控制,數(shù)據(jù)的格式化輸出等。q Controllers:Controllers負(fù)責(zé)處理頁面的請求,用戶呈現(xiàn)相應(yīng)的頁面。與傳統(tǒng)的頁面請求和頁面
8、運行方式不同的是,ASP.NET MVC開發(fā)模型中的頁面請求首先會發(fā)送到Controllers中,Controllers再通過Models進(jìn)行變量聲明和數(shù)據(jù)讀取。Controller通過頁面請求和路由設(shè)置呈現(xiàn)相應(yīng)的View給瀏覽器,用戶就能夠在瀏覽器中看到相應(yīng)的頁面。這里講解ASP.NET MVC開發(fā)模型的工作流程可能會讓讀者感到困惑,具體ASP.NET MVC開發(fā)模型的工作流程會在后面詳細(xì)講解。17.2 ASP.NET MVC基礎(chǔ)ASP.NET MVC開發(fā)模型和ASP.NET Web From開發(fā)模型并不相同,ASP.NET MVC為ASP.NET Web開發(fā)進(jìn)行了良好的分層,ASP.NET
9、 MVC開發(fā)模型和ASP.NET Web From開發(fā)模型在請求處理和應(yīng)用上都不盡相同,只有了解ASP.NET Web From開發(fā)模型的基礎(chǔ)才能夠高效的開發(fā)MVC應(yīng)用程序。 安裝ASP.NET MVCASP.NET MVC是微軟推出的最新的ASP.NET Web開發(fā)模型,開發(fā)人員可以在微軟的官方網(wǎng)站上下載ASP.NET MVC安裝程序,也能夠使用光盤中附屬的ASP.NET MVC安裝程序進(jìn)行安裝,光盤中附帶的是ASP.NET MVC beta版本,正式版同beta版本基本上沒有任何區(qū)別,開發(fā)人員可以在官方網(wǎng)站下載最新的安裝程序。單擊下載或附錄中的AspNetMVCBeta-setup.msi
10、進(jìn)行ASP.NET MVC開發(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)用程序的開發(fā),安裝完成ASP.NET MVC應(yīng)用程序后就能夠在Visual Studio 2008進(jìn)行創(chuàng)建ASP.NET MVC應(yīng)用程序。單擊【Install】按鈕應(yīng)用程序,系統(tǒng)就會在計算機中安裝ASP.NET MVC開發(fā)模型和Visual Studio 2008中進(jìn)行ASP.NET MVC程序開發(fā)所需要的必備組件以便在Visual Studio 2008為開發(fā)人員提供原生的ASP.NET MVC開發(fā)環(huán)境。安裝完畢后,安裝程序會提示ASP.NET MVC安裝程序已經(jīng)安裝完畢,安裝完畢后開發(fā)人員就能夠使用Visual Studio 2008開發(fā)ASP
12、.NET MVC應(yīng)用程序。安裝過程如圖17-4和17-5所示。圖17-4 ASP.NET MVC安裝 圖17-5 ASP.NET MVC安裝完畢新建一個MVC應(yīng)用程序安裝完成ASP.NET MVC開發(fā)模型后就能夠在Visual Studio 2008中創(chuàng)建ASP.NET MVC應(yīng)用程序進(jìn)行ASP.NET MVC應(yīng)用程序的開發(fā),安裝ASP.NET MVC開發(fā)模型后,Visual Studio 2008就能夠為ASP.NET MVC提供原生的開發(fā)環(huán)境。在菜單欄中選擇【文件】選項,單擊【文件】選項在下拉菜單中選擇【新建項目】就能夠創(chuàng)建ASP.NET MVC應(yīng)用程序,如圖17-6所示。單擊【確定】按鈕
13、后就能夠創(chuàng)建ASP.NET MVC應(yīng)用程序。Visual Studio 2008為ASP.NET MVC提供了原生的開發(fā)環(huán)境,以及智能提示,開發(fā)人員在進(jìn)行ASP.NET MVC應(yīng)用程序開發(fā)中,Visual Studio 2008同樣能夠為ASP.NET MVC應(yīng)用程序提供關(guān)鍵字自動補完、智能解析等功能以便開發(fā)人員高效的進(jìn)行ASP.NET MVC應(yīng)用程序的開發(fā)。創(chuàng)建ASP.NET MVC應(yīng)用程序后,系統(tǒng)會自動創(chuàng)建若干文件夾和文件,如圖17-7所示。圖17-6 創(chuàng)建ASP.NET MVC應(yīng)用程序 圖17-7 自動創(chuàng)建的文件在自動創(chuàng)建的文件中,這些文件包括ASP.NET MVC應(yīng)用程序中最重要的文件
14、夾用于分層開發(fā),這些文件夾分別為Models、Views和Controllers,分別對應(yīng)ASP.NET MVC開發(fā)模型的Models(模型)、Views(視圖)、Controller(控制器),開發(fā)人員能夠在相應(yīng)的文件夾中創(chuàng)建文件進(jìn)行ASP.NET MVC應(yīng)用程序的開發(fā)。17.2.3 ASP.NET MVC應(yīng)用程序的結(jié)構(gòu)在創(chuàng)建完成ASP.NET MVC應(yīng)用程序,系統(tǒng)會默認(rèn)創(chuàng)建一些文件夾,這些文件夾不僅包括對應(yīng)ASP.NET MVC開發(fā)模型的Models、Views和Controllers文件夾,還包括配置文件Web.config、Global.aspx和Default.aspx。1:頁面驅(qū)動
15、Default.aspx用于ASP.NET MVC應(yīng)用程序程序的驅(qū)動,當(dāng)用戶執(zhí)行相應(yīng)的請求時,Default.aspx能夠驅(qū)動ASP.NET MVC應(yīng)用程序頁面的處理和生成,Default.aspx頁面代碼如下所示。<% Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_17_1._Default" %>。IHttpHandler類獲取和發(fā)送HTTP請求,Default.aspx.cs頁面代
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ū)動。在ASP.NET MVC應(yīng)用程序被運行時,會攔截虛擬目錄的根路徑將請求發(fā)送到Controllers實現(xiàn)。2Global.asax:全局配置文件是全局配置文件,在ASP.NET MVC應(yīng)用程序中的應(yīng)用程序路徑是通過Global.asax文件進(jìn)行配置和實現(xiàn)的,頁面代碼如下所示。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",/配置訪問規(guī)則 new controller = &quo
19、t;Home", action = "Index", id = "" /為訪問規(guī)則配置默認(rèn)值 );/配置URL路由 protected void Application_Start() RegisterRoutes(RouteTable.Routes); 上述代碼在應(yīng)用程序運行后能夠?qū)崿F(xiàn)相應(yīng)的URL映射,當(dāng)用戶請求一個頁面時,該頁面會在運行時啟動并指定ASP.NET MVC應(yīng)用程序中URL的映射以便將請求提交到Controllers進(jìn)行相應(yīng)的編程處理和頁面呈現(xiàn)。實現(xiàn)了偽靜態(tài)的URL配置,例如當(dāng)用戶訪問/home/guestbook/number
20、服務(wù)器路徑時,通過URLRouting夠?qū)崿F(xiàn)服務(wù)器路徑/home/guestbook/number到number.aspx的映射。有關(guān)URLRouting的知識會在后面的小結(jié)中講解。注意:在ASP.NET MVC開發(fā)模型中,瀏覽器地址欄的URL并不能夠被稱為是偽靜態(tài),為了方便讀者的理解可以暫時稱為偽靜態(tài),但是最主要的是要理解訪問的路徑并不像傳統(tǒng)的Web開發(fā)中那樣是訪問真實的某個文件。3Models、Views和Controllers三層結(jié)構(gòu)Models、Views和Controllers文件夾是ASP.NET MVC開發(fā)模型中最為重要的文件夾,雖然這里以文件夾的形式呈現(xiàn)在解決方案管理器中,其實
21、并不能看作傳統(tǒng)的文件夾。Models、Views和Controllers分別用于存放ASP.NET MVC應(yīng)用程序中Models、Views和Controllers的開發(fā)文件。在創(chuàng)建ASP.NET MVC應(yīng)用程序后,系統(tǒng)會自行創(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頁面文件。運行ASP.NET MVC應(yīng)用程序后,用戶的請求會發(fā)送到Controllers控制器中,Co
22、ntrollers控制器接受用戶的請求并通過編程實現(xiàn)Views頁面文件的映射。運行ASP.NET MVC應(yīng)用程序創(chuàng)建ASP.NET MVC應(yīng)用程序后就能夠直接運行ASP.NET MVC應(yīng)用程序,默認(rèn)的ASP.NET MVC應(yīng)用程序已經(jīng)提供了樣例方便開發(fā)人員進(jìn)行編程學(xué)習(xí),單擊【F5】運行ASP.NET MVC應(yīng)用程序,運行后如圖17-10所示。在創(chuàng)建ASP.NET MVC應(yīng)用程序后系統(tǒng)會創(chuàng)建樣例,圖17-10顯式的就是ASP.NET MVC默認(rèn)運行界面,單擊旁邊的【About Us】連接頁面跳轉(zhuǎn)到相應(yīng)的頁面,如圖17-11所示。圖17-10 ASP.NET MVC應(yīng)用程序初始界面 圖17-11
23、About頁面當(dāng)單擊【About Us】鏈接后,頁面會跳轉(zhuǎn)到關(guān)于頁面,頁面URL為http:/localhost:2448/Home/About。在ASP.NET MVC應(yīng)用程序中,URL路徑的請求方式與傳統(tǒng)的ASP.NET Web Form應(yīng)用程序不同,開發(fā)人員可以發(fā)現(xiàn),在服務(wù)器文件中并沒有/Home/About/index.aspx文件也沒有/Home/About/這個目錄。注意:在ASP.NET MVC應(yīng)用程序中,這里再三強調(diào),其URL并不是服務(wù)器中的某個文件而是一種地址映射。在服務(wù)器中沒有/Home/About/index.aspx文件也沒有/Home/About/這個目錄,因為/Ho
24、me/About中所呈現(xiàn)的頁面是通過Controller控制器進(jìn)行相應(yīng)的文件的路徑的映射的,關(guān)于地址映射的內(nèi)容會在后面的小結(jié)中詳細(xì)講解。17.3 ASP.NET MVC原理運行了ASP.NET MVC應(yīng)用程序后,就能夠通過相應(yīng)的地址訪問不同的頁面。在ASP.NET MVC應(yīng)用程序中,應(yīng)用程序中頁面的URL并不是在服務(wù)器中實際存在的頁面或目錄而是訪問了相應(yīng)的方法s實現(xiàn)了URL映射。17.3.1 ASP.NET MVC運行流程。同樣當(dāng)訪問相應(yīng)的ASP.NET MVC應(yīng)用程序頁面,在服務(wù)器中并不存在對應(yīng)的頁面。為了了解如何實現(xiàn)頁面映射,就需要了解ASP.NET MVC應(yīng)用程序的運行流程。s實現(xiàn)了UR
25、L映射。當(dāng)用戶進(jìn)行ASP.NET MVC程序的頁面請求時,該請求首先會會被發(fā)送到Controllers控制器中,開發(fā)人員能夠在控制器Controllers中創(chuàng)建相應(yīng)的變量并將請求發(fā)送到Views視圖中,Views視圖會使用在Controllers控制器中通過編程方式創(chuàng)建相應(yīng)的變量并呈現(xiàn)頁面在瀏覽器中。當(dāng)用戶在瀏覽器中對Web應(yīng)用進(jìn)行不同的頁面請求時,該運行過程將會循環(huán)反復(fù)。對于Models而言,Controller通常情況下使用Models讀取數(shù)據(jù)庫。在Models中,Models能夠?qū)鹘y(tǒng)的關(guān)系型數(shù)據(jù)庫映射成面向?qū)ο蟮拈_發(fā)模型,開發(fā)人員能夠使用面向?qū)ο蟮乃枷脒M(jìn)行數(shù)據(jù)庫的數(shù)據(jù)存取。Contro
26、llers從Model中讀取數(shù)據(jù)并存儲在相應(yīng)的變量中,如圖17-12所示。圖17-12 ASP.NET MVC運行流程正如圖17-12所示,在用戶進(jìn)行頁面請求時,首先這個請求會發(fā)送到Controllers中,Controllers從Models中讀取相應(yīng)的數(shù)據(jù)并填充Controllers中的變量,Controllers接受相應(yīng)請求再將請求發(fā)送到Views中,Views通過獲取Controllers中的變量的值進(jìn)行整合并生成相應(yīng)的頁面到用戶瀏覽器中。在Models中需要將數(shù)據(jù)庫抽象成面向?qū)ο笾械囊粋€對象,開發(fā)人員能夠使用LINQ進(jìn)行數(shù)據(jù)庫的抽象,這樣就能夠方便的將數(shù)據(jù)庫中的數(shù)據(jù)抽象成相應(yīng)的對象并
27、通過對象的方法進(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)行不同層次的開發(fā),在ASP.NET MVC應(yīng)用程序的運行過程中,同樣請求會發(fā)送到Controllers中,這樣就對應(yīng)了ASP.NET MVC應(yīng)用程序中的Controllers文件夾,Controllers只負(fù)責(zé)數(shù)據(jù)的讀取和頁面邏輯的處理。在Controllers讀取數(shù)據(jù)時,需要通過Models中的LINQ to SQL從數(shù)據(jù)中讀取相應(yīng)的信息,讀取數(shù)據(jù)完畢后,Controllers再將數(shù)據(jù)和Control
28、ler整合并提交到Views視圖中,整合后的頁面將通過瀏覽器呈現(xiàn)在用戶面前。當(dāng)用戶訪問http:/localhost:2448/Home/About頁面時,首先這個請求會發(fā)送到Controllers中,Controllers通過Global.ascx文件中的路由設(shè)置進(jìn)行相應(yīng)的URL映射,Global.ascx文件相應(yīng)代碼如下所示。 public static void RegisterRoutes(RouteCollection routes)/注冊路由 routes.IgnoreRoute("resource.axd/*pathInfo"); routes.MapRout
29、e( "Default", "controller/action/id", new controller = "Home", action = "Index", id = "" /配置路由 ); 上述代碼中實現(xiàn)了映射操作,具體是如何實現(xiàn)可以先無需關(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)用戶訪問st:2448/Home/About路徑時,首先該路徑請求會傳送到Controller中。注意:在Controllers文件夾中創(chuàng)建文件同Home是同名文件,在Controllers中創(chuàng)建的文件,其文件名后的是不能更改的,所以文件也可以看做是Home文件夾的同名文件。在Controller中,Controller通過相應(yīng)的編程實現(xiàn)路徑的映射,示例代碼如下所示。 HandleError public class HomeController : Controller public
31、 ActionResult About()/實現(xiàn)About頁面 ViewData"Title" = "About Page" return View();/返回視圖 上述代碼實現(xiàn)了About頁面的頁面呈現(xiàn),在運行相應(yīng)的方法后會返回一個View,這里默認(rèn)返回的是與Home的About方法同名的頁面,這里是about.aspx,about.aspx頁面代碼如下所示。<% 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頁面中的文字進(jìn)行相應(yīng)的更改,示例代碼如下所示。<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server"> <h2>About Us</h2> <p><span style=”color:red”>這是一個關(guān)于頁面</span> </p>
34、;</asp:Content>運行about.aspx頁面,運行后如圖17-14所示。圖17-14 修改后的About Us頁面從上述代碼可以看出,Controllers與Global.ascx用于URL的映射,而Views用于頁面的呈現(xiàn)。從這里可以看出,當(dāng)用戶訪問http:/localhost:2448/Home/About頁面時,訪問的并不是服務(wù)器中的/Home/About頁面,而訪問的是Controllers中的HomeControllers的About方法。注意:ASP.NET MVC應(yīng)用程序中的URL路徑訪問的并不是一個頁面,而是一個方法,例如訪問/Home/About頁
35、面就是訪問的是HomeControllers中的About方法,而訪問/Account/Login頁面就是訪問的是AccountControllers中的Login方法。在ASP.NET MVC應(yīng)用程序中,ASP.NET MVC應(yīng)用程序的對應(yīng)關(guān)系如圖17-15所示。圖17-15 ASP.NET MVC應(yīng)用程序關(guān)系圖在ASP.NET MVC應(yīng)用程序中,HomeController.cs對應(yīng)Views的Home文件夾,而其中的Index方法和About方法對應(yīng)Index.aspx文件和About.aspx文件。,而訪問路徑為XXX/YYY是訪問的是XXXController.cs中的YYY()方法
36、。實現(xiàn)相應(yīng)的URL映射需要通過修改Global.ascx文件進(jìn)行實現(xiàn),如何通過修改Global.ascx文件進(jìn)行不同的URL映射將在后面的小結(jié)中講解。17.4 ASP.NET MVC開發(fā)在了解了ASP.NET MVC工作原理和工作流程,以及ASP.NET MVC中的URL映射基礎(chǔ)原理,就能夠進(jìn)行ASP.NET MVC應(yīng)用程序的開發(fā),在進(jìn)行ASP.NET MVC應(yīng)用程序開發(fā)的過程中可以深入的了解ASP.NET MVC應(yīng)用程序模型和URL映射原理。創(chuàng)建ASP.NET MVC頁面ASP.NET MVC應(yīng)用程序包括MVC三個部分,其中Models是用于進(jìn)行數(shù)據(jù)庫抽象,Views是用于進(jìn)行視圖的呈現(xiàn)而C
37、ontrollers是用于控制器和邏輯處理,在創(chuàng)建ASP.NET MVC應(yīng)用程序時,可以為ASP.NET MVC應(yīng)用程序分別創(chuàng)建相應(yīng)的文件。首先在Views文件夾中創(chuàng)建一個文件夾,這里創(chuàng)建一個Beta文件夾。創(chuàng)建文件夾后單擊Beta文件夾,右擊文件夾,在下拉菜單中選擇【添加】選項,在【添加】選項中單擊【新建項】選項,單擊后系統(tǒng)會彈出對話框用于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頁面代碼如下所
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">這是一個測試頁面</span></p>Index.aspx頁面用于視圖的呈現(xiàn),在中,的,而ASP.NET MV
39、C應(yīng)用程序頁面代碼需要派生自ViewPage,示例頁面代碼如下所示。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)用程序開發(fā)模型中還需要創(chuàng)建Controllers用于接受用戶請求和Beta.aspx頁面同名的方法實現(xiàn)。單擊Controllers文件夾,右擊Co
40、ntrollers文件夾,在下拉菜單中選擇【添加】選項,在【添加】選項中單擊【新建項】選項。這里可以創(chuàng)建一個同名的類文件,如圖17-17所示。圖17-17 創(chuàng)建Controllers文件創(chuàng)建Controllers類文件時,創(chuàng)面的類文件的名稱必須為Views文件夾中相應(yīng)的視圖文件夾的名稱加上Controllers.cs,正如圖17-17所示,如創(chuàng)建的是“Beta”文件夾,在創(chuàng)建Controllers時必須創(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()/實現(xiàn)Index方法 return View();/返回Index視圖 頁面的訪問。Views中的。單擊【F5】運行頁面,運行后如圖17-18所示。圖17-18 MVC頁面運行這里講解了
42、如何手動創(chuàng)建ASP.NET MVC頁面。在某些版本的Visual Studio中,安裝了ASP.NET MVC開發(fā)包應(yīng)用程序后,可能不會存在MVC文件的創(chuàng)建,這時只能通過創(chuàng)建ASP.NET Web Form再通過編碼實現(xiàn)。如果希望能夠創(chuàng)建ASP.NET MVC模板而不使用手動創(chuàng)建可以在C:Program FilesMicrosoft ASP.NETASP.NET MVC BetaTemp目錄下將壓縮包拷貝到相應(yīng)的Visual Studio安裝目錄X:Microsoft Visual Studio 9.0Common7IDEItemTemplatesCSharpWeb2052中,拷貝后在開始菜單
43、中選擇“運行”,在窗口中輸入cmd,就會彈出一個黑色的命令行窗口,在命令行輸入cd X:Microsoft Visual Studio 9.0Common7IDEItemTemplatesCSharpWeb2052進(jìn)入目錄,輸入devenv.exe /setup進(jìn)行模板的安裝,安裝完成后就能夠在添加新項中選擇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ù)的讀取和邏輯運算,數(shù)據(jù)的讀取和邏輯運算都交付給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中,其值并不是固定的,而是通過Controllers傳遞過來的,在Controllers類文件中的頁面實現(xiàn)代碼中,可以需要使用ViewData進(jìn)行值的傳遞,BetaControllers.cs中Index.aspx實現(xiàn)的Index()的方法示例代碼如下所示。 HandleError public class BetaController : Cont
45、roller public ActionResult Index()/實現(xiàn)Index方法 ViewData"beta" = "這是一個ViewData字符串"/使用ViewData return View();/返回視圖 上述代碼使用ViewData存儲數(shù)據(jù),ViewData的聲明和賦值方式與Session對象相同,直接通過編寫ViewData鍵值的名稱=XXX進(jìn)行相應(yīng)的鍵值的賦值。如果需要在頁面中進(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()方法實現(xiàn)的是Index.aspx頁面,在Index.aspx可以使用ViewData"beta"變量,示例代碼如下所示。<h2>About Us</h2><p> <span style="color:Red">這是一個測試頁面</span><br/> <span style="color:Green"><%=ViewDat
47、a"beta" %></span></p>上述代碼中在運行后會輸出ViewData"beta"變量中存儲的值,運行后如圖17-19所示。圖17-19 輸出ViewDataViewData不僅可以為某個具體的值,ViewData還可以是一個泛型變量,示例代碼如下所示。 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頁面中也可以輸出ViewData的值,
49、示例代碼如下所示。<h2>About Us</h2><p> <span style="color:Red">這是一個測試頁面</span><br/> <% foreach(string str in ViewData"beta" as List<string>) %> <% = str%></p>上述代碼通過使用foreach進(jìn)行ViewData變量中相應(yīng)健值的值的遍歷,運行后如圖17-20所示。圖17-20 遍歷ViewData變量的
50、值使用List類能夠?qū)?shù)據(jù)庫中的數(shù)據(jù)存放在泛型列表類中,開發(fā)人員能夠?qū)?shù)據(jù)庫中的數(shù)據(jù)遍歷并存放在Controllers類文件中的頁面實現(xiàn)的類的ViewData變量中,當(dāng)需要遍歷數(shù)據(jù)進(jìn)行呈現(xiàn)時,例如新聞列表或者是論壇列表等,可以通過遍歷ViewData變量的值遍歷輸出數(shù)據(jù)庫中的數(shù)據(jù)。17.4.3 ASP.NET MVC 跨頁數(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)頁面可以使用此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變量的值,運行后如圖17-21所示。圖17-21 顯示TempData變量在數(shù)據(jù)呈現(xiàn)上,TempData變量同ASP.NET MVC ViewData基本相同,但是TempData能夠在跳轉(zhuǎn)中保存值。當(dāng)用戶訪問一個頁面時,該頁面的Controllers中包含TempData變量。當(dāng)這個頁面通過Redirect跳轉(zhuǎn)到另一個頁面時,另
53、一個頁面能夠使用跳轉(zhuǎn)頁面的TempData變量。在跳轉(zhuǎn)頁面中,在跳轉(zhuǎn)前可以編寫TempData變量保存相應(yīng)的值,示例代碼如下所示。 HandleError public class BetaController : Controller public ActionResult Index() TempData"Index" = "這是跳轉(zhuǎn)頁面的字符串哦."/編寫TempData Response.Redirect("/Beta/Get");/頁面跳轉(zhuǎn) return View();/返回視圖 上述忽代碼編寫了一個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>編寫了頁面代碼后還不能對頁面進(jìn)行訪問,由于MVC編程模型中路徑是訪問的Co
55、ntroller中的方法,所以還需要在Controller中實現(xiàn)Get頁面的方法,示例代碼如下所示。 public ActionResult Get() return View();/返回默認(rèn)視圖 上述代碼返回默認(rèn)視圖,當(dāng)不給頁面文件。這里沒有對View方法傳遞參數(shù),則返回的是Get.aspx頁面視圖,當(dāng)用戶訪問/Beta/路徑時,代碼會創(chuàng)建一個TempData變量并跳轉(zhuǎn)到/Beta/Get路徑,在/Beta/Get路徑相應(yīng)的文件中可以獲取跳轉(zhuǎn)前的TempData變量的值,運行后如圖17-22所示。圖17-22 接受TempData變量的值TempData變量,而是在跳轉(zhuǎn)前的頁面中聲明的TempData變量,與ViewData相比跳轉(zhuǎn)后的頁面能夠獲取TempData變量的值而不能獲取ViewData的值,這在某些應(yīng)用場合如拋出異常等情況下非常適用。注意:TempData變量在跳轉(zhuǎn)中能夠跨頁面進(jìn)行數(shù)據(jù)讀取,但是跨頁面跳轉(zhuǎn)后TempData變量只能呈現(xiàn)一次。簡單的說就是跳轉(zhuǎn)的第一次能過獲取跳轉(zhuǎn)前頁面的TempData變量的值,而再次操作時就無法使用跳轉(zhuǎn)前頁面的TempData變量值。17.4.4 ASP.NET MVC頁面重定向在ASP.NET Web Form中,可以通過R
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新能源車輛生產(chǎn)合同
- 服裝品牌加盟經(jīng)營合同
- 電影發(fā)行放映協(xié)議
- 乘法怎么算初一數(shù)學(xué)試卷
- 工程居間費合同范本
- 彩虹魚海洋冒險征文
- 房地產(chǎn)行業(yè)VR看房與在線咨詢平臺開發(fā)方案
- 慶陽扶手電梯裝潢施工方案
- 中學(xué)生物理趣味實驗故事
- 高中歷史第六單元20世紀(jì)以來中國重大思想成果單元小結(jié)與測評課件新人教版必修
- GB/T 4852-2002壓敏膠粘帶初粘性試驗方法(滾球法)
- GB/T 38836-2020農(nóng)村三格式戶廁建設(shè)技術(shù)規(guī)范
- 醫(yī)院固定資產(chǎn)及物資購置工作流程圖
- 中學(xué)學(xué)校辦公室主任個人述職報告
- GA/T 1774-2021法庭科學(xué)手印檢驗實驗室建設(shè)規(guī)范
- 京東商業(yè)計劃書課件
- 2023年陜西金融控股集團(tuán)有限公司校園招聘筆試題庫及答案解析
- 九年級生命生態(tài)安全教案(完整版)
- 部編版五年級下冊語文根據(jù)課文內(nèi)容填空(常用)
- 中鐵集團(tuán)會計核算手冊
- 傷口護(hù)理小組工作總結(jié)共34張課件
評論
0/150
提交評論