




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第11章ASP.NETMVC4本章學(xué)習(xí)目標MVC模式的基本概念理解Routing學(xué)會創(chuàng)建模型學(xué)會創(chuàng)建控制器學(xué)會使用視圖11.1 MVC4開發(fā)環(huán)境安裝配置
11.1.1安裝VisualStudio2010SP111.1.2安裝MVC411.1.1安裝VisualStudio2010SP1VisualStudio2010SP1安裝好了之后,那就可以開始安裝MVC4,安裝MVC4之前新建項目的時候是沒有ASP.NETMVC4的項目模板的,只有ASP.NETMVC2的模版??梢栽谖④浀墓倬W(wǎng)上可以下載到MVC4的安裝文件。11.1.2安裝MVC4VisualStudio2010SP1安裝好了之后,那就可以開始安裝MVC4,安裝MVC4之前新建項目的時候是沒有ASP.NETMVC4的項目模板的,只有ASP.NETMVC2的模版??梢栽谖④浀墓倬W(wǎng)上可以下載到MVC4的安裝文件。11.2 MicrosoftWeb開發(fā)平臺1. 活動服務(wù)頁微軟的第一個Web開發(fā)平臺是ASP,它將腳本語言和代碼放置于同一個文件里,網(wǎng)站里的每一個頁面對應(yīng)一個物理文件。當(dāng)然現(xiàn)在還是有很多ASP網(wǎng)站還在運行。但是時間長了開發(fā)人員就希望改進代碼的復(fù)用性、更好地分離關(guān)注點以及更方便地進行面向?qū)ο蟮木幊涕_發(fā)。在2002年,微軟提供了一個新的Web開發(fā)平臺——ASP.NET來滿足這些需求。2. ASP.NETWeb表單與ASP—樣,ASP.NET網(wǎng)站也提供了基于頁面的方式,每個頁面對應(yīng)一個物理文件,稱為WebForm(Web表單),并且可以通過文件名訪問。與ASP不同的是,WebForm頁面提供了代碼分離機制,把代碼文件和HTML#、簽分離到兩個不同的文件中,ASP.NETWebForm已經(jīng)發(fā)展了很多年,但仍是很多開發(fā)人員的選擇之一。3. ASP.NETMVC微軟很快發(fā)現(xiàn)了ASP.NET開發(fā)人員的新需求,這些需求不同于之前基于頁面的WebForm方法。于是,微軟在2008年發(fā)布了第一版ASP.NETMVC。這與之前的WebForm方法完全不同,ASP.NETMVC拋棄了基于頁面的架構(gòu)風(fēng)格,使用了全新的MVC(模型-視圖控制器)架構(gòu)。與ASP.NETWebForm取代ASP不同,ASP.NETMVC并沒有取代ASP.NETWebForm的意思。恰恰相反,ASP.NETMVC和ASP.NETWebForm可以共存,它們都構(gòu)建于ASP.NET框架之上,并且都使用了很多相同的WebAPI。ASP.NETMVC和ASP.NETWebForm只是開發(fā)ASP.NET網(wǎng)站的不同方法。11.3 MVC架構(gòu)MVC全名是ModelViewController,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設(shè)計典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)和界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務(wù)邏輯。MVC被獨特的發(fā)展起來用于映射傳統(tǒng)的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結(jié)構(gòu)中。MVC模式是一種嚴格實現(xiàn)應(yīng)用程序各部分隔離的架構(gòu)模式。這種“隔離”有一個更響亮的名字“分離關(guān)注點”,更通俗的名稱是“松耦合”。松耦合的應(yīng)用程序架構(gòu)設(shè)計方式,無論是短期還是長期,都能帶來巨大的好處:1. 開發(fā)單個組件不直接依賴干其他組件,這就意味著每個組件可以獨立部署,也可以被替換。這種不使用單一文件編譯組件的方式減少了與之相關(guān)的組件之間的影響。2. 測試組件之間的松耦合帶來的好處就是允許測試代碼可以替換真實的產(chǎn)品組件。這樣可以盡可能減少直接調(diào)用數(shù)據(jù)庫,可以直接讓數(shù)據(jù)庫調(diào)用組件返回靜態(tài)數(shù)據(jù)。這種模擬測試大大地簡化,提升了系統(tǒng)的真實性測試流程。3. 維護隔離組件邏輯意味著把影響隔離到最少的組件中(通常只有一個)。改變的風(fēng)險通常組件影響的范圍有關(guān)系,改變的數(shù)量越少,影響就越小,這是顯而易見的。11.3 MVC架構(gòu)MVC模式把應(yīng)用程序分割成三個部分:模型、視圖和控制器。每個部分擁有特定的職責(zé),而且它不需要關(guān)注其他層如何工作。模型模型代表著核心的業(yè)務(wù)邏輯和數(shù)據(jù)。模型封裝了域?qū)嶓w的屬性和行為,并暴露出了實體的屬性。例如,Auction類代表“拍賣”的邏輯概念,暴露了一些屬性,如Title和CurrentBid,同時也包括表示行為的一些方法,如Bid()。視圖負責(zé)轉(zhuǎn)換模型井把它傳遞給表示層。在Web應(yīng)用中,雖然視圖有多種形式,但是通常指的是生成那些可以在用戶瀏覽器中渲染的HTML代碼,相同的模型可以在HTML、PDF、XML,甚至Excel電子表格里展示。遵循“分離關(guān)注點”的原則,視圖應(yīng)該關(guān)注于如何展示數(shù)據(jù),而不應(yīng)該包含任何業(yè)務(wù)邏輯——業(yè)務(wù)邏輯封裝在模型中,這些模型可以提供視圖需要的任何東西??刂破骺刂破骺刂瞥绦虻倪壿?,并且充當(dāng)著視圖和模型層之間協(xié)調(diào)的角色??刂破鲝囊晥D層接收用戶輸入的信息,然后使用模型來執(zhí)行特定的操作,井把最終的結(jié)果回傳給視圖。11.4 ASP.NETMVC4的新特性1. WebAPI2. 移動項目模板使用JQueryMobile3. 異步控制器4. 顯示模式5. 合并與壓縮11.5 創(chuàng)建ASP.NETMVC4應(yīng)用程序
11.5.1 項目模板11.5.2 慣例優(yōu)先原則11.5.3 運行程序11.5.1 項目模板
1. 空模板3. 互聯(lián)網(wǎng)應(yīng)用程序模板4. 局域網(wǎng)應(yīng)用程序模板5. 移動應(yīng)用程序模板6. WebAPI11.5.2 慣例優(yōu)先原則
對于很多項目來說,遵從已有的慣例和使用合理的缺省選項是最快捷的開發(fā)方式。具體來說,如果你在項目中遵守一定的慣例(比如命名規(guī)范),你就可以顯著地減少系統(tǒng)需要的配置(比如處理器映射,視圖解析器配置等等)。ASP.NETMVC就依賴于這種“慣例優(yōu)先原則”,這也就意味著ASP.NETMVC會假定開發(fā)人員遵守特定的慣例來構(gòu)建自己的程序而不是使用配置文件。ASP.NETMVC項目文件夾結(jié)構(gòu)則是“慣例優(yōu)先原則”最好的例子。它里面有三個元素分別對應(yīng)于MVC架構(gòu)模式:控制器文件夾、模型文件夾和視圖文件夾,結(jié)構(gòu)清晰,方便掌握。但是當(dāng)我們仔細看那些文件夾時,就會發(fā)現(xiàn)更多的“慣例”。例如,不僅是控制器文件夾包含所有的控制器類,而且每個控制器類都以“Controller”結(jié)尾。整個MVC框架都使用這個慣例來注冊控制器,并將它們與相應(yīng)的路由器關(guān)聯(lián)。11.5.3 運行程序
ASP.NETMVC處理請求的過程11.6 路由
所有的ASP.NETMVC請求開始與其他的網(wǎng)站一樣,使用一個帶有URL的請求,這意味著盡管沒有到處提及路由,但是ASP.NETRouting仍然是ASP.NETMVC請求的核心。簡單來說,ASP.NET路由是個模式匹配系統(tǒng)。開始時,應(yīng)用程序使用路由表注冊一種或者多種模式,告訴路由系統(tǒng)如何處理這些與模式匹配的請求。路由引擎在運行時接收到請求以后,它就會根據(jù)事先注冊的URL模式匹配當(dāng)前請求的URL。當(dāng)路由引擎在路由表里發(fā)現(xiàn)匹配的模式時,它就會把請求轉(zhuǎn)發(fā)給特定的處理器來處理;如果找不到匹配的任何路由,路由引擎就不知道如何處理這個請求,就會返回404狀態(tài)錯誤碼。11.6 路由
配置路由ASP.NETMVC路由負責(zé)確定由哪個控制器操作來處理特定的URL請求。它由以下屬性組成。Uniquename:路由唯一的名字。URLpattern:將URL解析成有意義詞語的簡單模式語法。Defaults:URL模式里定義的參數(shù)變量的默認值。Constraints:為URL匹配模式定義更嚴格的約束規(guī)則。默認的ASP.NETMVC項目添加了一個通用的路由,它使用以下URL習(xí)慣來解析特定的URL請求,即分三個部分,包含在大括號內(nèi):controller,action,id。{controller}/{action}/{id}11.6 路由
默認的ASP.NETMVC項目添加了一個通用的路由,它使用以下URL習(xí)慣來解析特定的URL請求,即分三個部分,包含在大括號內(nèi):controller,action,id。{controller}/{action}/{id}注冊路由使用的擴展方法是MapRoute(),在程序啟動的時候注冊(在APP_Start/RouteConfig.cs文件里):routes.MapRoute(“Default”,//路由名字“{controller}/{action}/{id}”,//URL參敦
new{controller="Home",action="Index",id=UrlParameter.Optional}//默認參數(shù));除了name和URLpattern外,路由器同樣定義了模式匹配事件中使用的一系列默認參數(shù),但實際上并沒有給每個參數(shù)提供默認值。11.6 路由
匹配這個路由的所有URL及與之對應(yīng)的值URLControllerActionID/auctions/auction/1234AuctionsControllerAuction1234/auctions/recentAuctionsControllerRecent
/auctionsAuctionsControllerIndex
/HomeControllerIndex
11.7 控制器
11.7.1 控制器操作11.7.2 操作結(jié)果11.7.3 操作參數(shù)11.7.4 操作過濾器11.7 控制器
在MVC架構(gòu)模式的上下文里,控制器響應(yīng)用戶的輸入(比如,用戶點擊“保存”按鈕),并協(xié)調(diào)模型,視圖以及數(shù)據(jù)訪問層。在ASP.NETMVC程序里,控制器就是包含被路由框架處理請求時調(diào)用的方法的類。11.7.1 控制器操作
控制器類跟別的.NET類幾乎是沒什么區(qū)別的。事實上,控制器類里的方法(稱為控制器的操作)做了處理請求過程中的主要工作。例如,HomeController類包含三個操作:Index、About和Contact。然而,假設(shè)默認的路由模式是{controller}/{action}/{id},當(dāng)一個請求的URL是/Home/About時,路由框架會決定由HomeController類中的About方法來處理這個請求。然后,ASP.NETMVC框架會創(chuàng)建HomeController的實例,并執(zhí)行About()方法。11.7.2 操作結(jié)果
對于控制器來說,它的工作就是告訴ASP.NETMVC框架下一步應(yīng)該做什么,而不是怎么做。例如,當(dāng)控制器決定如何顯示視圖時,它就會告訴ASP.NETMVC框架通過返回ViewResult來展示視圖,而不會自己渲染視圖。這種松耦合的設(shè)計,也是操作中“分離關(guān)注點”原則的直接體現(xiàn)(應(yīng)該干什么和怎么干)。11.7.2 操作結(jié)果
盡管每個控制器的操作都要返回ActionResult,但是大部分時間不需要你手動完成。相反地,只需要使用System.Web.Mvc.Controller基類提供的幫助方法即可,例如:Content()返回文本類型的ContentResult,比如“Hello,world!”。File()返回文件類型的內(nèi)容FileResult,比如PDF。HttpNotFound()返回包含404HTTP狀態(tài)碼的HttpNotFoundResult。JavaScript()返回JavaScriptResult。返回包含JavaScript內(nèi)容的JavaScriptResult,比如“functionhello(){alert(Hello,World!);}”Json()返回JSON格式數(shù)據(jù)的JsonResult,比如“{“Message”:Hello,World!}”。PartialView()返回包含部分視圖內(nèi)容的PartialViewResult(例如,視圖可能不包含結(jié)局)。Redirect()返回一個包含302跳轉(zhuǎn)狀態(tài)值RedirectResult,跳轉(zhuǎn)到給定的URL上。RedirectToAction()和RedirectToRoute()與Redirect()類似,只有框架可以動態(tài)査詢路由引擎來確定外部的URL與Redirect()一樣,它們同樣包含永久跳轉(zhuǎn)方法:RedirectToActionPermanent()和RedirectTo-RoutePermanent()。View()返回渲染視圖的ViewResult。11.7.3 操作參數(shù)
單獨來看控制器操作和別的方法并沒什么兩樣。事實上,執(zhí)行操作時,控制器操作甚至可以使用ASP.NETMVC請求消息發(fā)送過來的參數(shù)。這種功能稱為“模型綁定”,它同時也是ASP.NETMVC最強大最有用的特性。傳統(tǒng)的請求傳值方式。主要的請求傳值方式有:URL傳值,Session傳值,視圖狀態(tài)傳值,文件傳值等11.7.3 操作參數(shù)
1. 模型綁定的基本概念模型綁定不僅可以避免使用大量顯式代碼,而且使用起來較為方便。例如之前的控制器操作,以下方法使用了模型綁定方法參數(shù):publicActionResultCreate(Stringtitle,decimal,currentPrice;DateTimestartTime,DateTime,endTime;){Varauction=newAuction(){Title=title,CurrentPrice=currentPrice,StartTime=endTime,};//...}11.7.3 操作參數(shù)
2. 模型綁定復(fù)雜對象使用模型綁定的方法,無論是否是簡單的基元類型,都可以讓代碼更直觀簡潔。但是一般來說,現(xiàn)實世界往往是一個復(fù)雜體,只有及其簡單的場景才需要幾個參數(shù)。所以,ASP.NETMVC同樣支持綁定復(fù)雜的數(shù)據(jù)類型。11.7.4 操作過濾器
操作過濾器通過提供更加簡單強大的機制去修改或者增強ASP.NETMVC管道,在特定的點注入邏輯,幫助處理貫穿程序中各個模塊的橫切關(guān)注點(cross-cuttingconcerns)問題。應(yīng)用程序日志就是典型的橫切關(guān)注點的例子——無論組件的主要職責(zé)是什么,日志貫穿于應(yīng)用程序的任何模塊。操作過濾器在代碼中體現(xiàn)為添加到Action上方的屬性,MVC框架包含了一些過濾器,如:OutputCache-指示Controller在指定時間內(nèi)緩存返回的結(jié)果。HandleError-處理Contrller中Action拋出的異常。Authorize-約束特定用戶或角色對Action的訪問。11.7.4 操作過濾器
操作過濾器不僅可以控制單個Action,也可以控制整個Controller。同時,一個Action可以應(yīng)用多個過濾器。比如:publicclassDataController:Controller{[OutputCache(Duration=10)]publicstringIndex(){returnDateTime.Now.ToString("T");}[Authorize]publicActionResultProfile(){ //為當(dāng)前用戶查詢個人信息
returnView();}}這個Action返回了當(dāng)前時間,但是你若在10秒鐘內(nèi)刷新界面,你會一直得到同一個值,因為這里使用了OutputCache(Duration=10)。而Authorize可以保護任何未授權(quán)的訪問操作。11.8 視圖
11.8.1 定位視圖11.8.2 Razor11.8.3 區(qū)分代碼和標記語言11.8.4布局11.8.5 部分視圖11.8.6 顯示數(shù)據(jù)11.8.7 使用HtmlHelper11.8 視圖
在ASP.NETMVC框架中,想要返回給用戶控制器操作的結(jié)果,就要返回ActionResult類型的ViewResult實例,ActionResult知道如何渲染響應(yīng)結(jié)果。當(dāng)渲染視圖時,ASP.NETMVC將會使用控制器提供的名字。以HomeController的Index操作為例,如下:publicActionResultIndex(){ViewBag.Message="Yourappdescriptionpage.";ReturnView();}這個操作將會使用View()來創(chuàng)建ViewResult。ASP.NETMVC會找到一個和當(dāng)前Action一樣的視圖名字。11.8.1 定位視圖
ASP.NETMVC依賴慣例是在網(wǎng)站根目錄下面的Views文件夾中査找這個視圖文件。更確切地說,ASP.NETMVC希望視圖文件放在以它們對應(yīng)的控制器名字命名的文件夾中。因此,如果MVC框架想為HomeController的Index操作顯示視圖,那么它就要在/Views/Home文件夾(/Views/Shared文件夾是保存共享多個控制器視圖的位置)下查找名為Index的文件。11.8.2 Razor
Razor是一種允許把代碼和內(nèi)容進行集成的語法。盡管它引入了一些新的符號和關(guān)鍵字,但是Razor并不是一種新的語法。相反,Razor允許用戶使用已知的語言來編寫代碼,比如C#或者VB.NET。<div>Thispagerenderedat@DataTime.Now</div>這些代碼會輸出:<div>Thispagerenderedat12/7/20177:35:00AM</div>11.8.2 Razor
Razor智能感知解析器允許用戶編寫更復(fù)雜的邏輯代碼,而且可以在代碼和標簽之間輕易轉(zhuǎn)換。雖然Razor語法與其他的標記語法不同(比如ASP.NETWebForm),但是它們的目標是相同的,都是渲染HTML。11.8.3 區(qū)分代碼和標記語言
Razor提供了兩種不同的方式區(qū)分代碼和標簽:代碼段和代碼塊。1. 代碼段代碼段只是一些簡單的表達式,它們可以在一行中進行渲染,也可以與文本混合,例如:NotLoggedIn:@Html.ActionLink("Login","Login")表達式跟在@之后,Razor能夠智能確定左括號的結(jié)束部分。上面例子將會渲染以下的輸出結(jié)果:NotLoggedIn:<ahref="/Login">Login</a>但是需要注意的是,這行代碼必須返回標記代碼給視圖渲染。如果編寫的代碼返回了void,就會在執(zhí)行視圖的時候出錯。11.8.3 區(qū)分代碼和標記語言
2. 代碼塊Razor代碼塊起于@并用{}包圍起來。不像代碼段,代碼塊內(nèi)的C#代碼不會被渲染到頁面中。Razor頁面中的代碼塊和表達式將共享同一個作用域,并按順序定義(也就是說,之前在代碼塊中聲明的對象可以在之后的代碼塊與表達式中使用)。一定要記住的是,代碼塊里的代碼與代碼段里的代碼不同,前者是常規(guī)代碼,必須符合當(dāng)前語言的語法。例如,每行C#代碼必須以結(jié)尾,這與在.CS文件里編寫C#類的代碼一樣。下面是一個典型的代碼塊例子:@{LayoutPage="~/Views/Shared/_Layout.cshtml";View.Title="Auction"+Model.Title;}11.8.3 區(qū)分代碼和標記語言
代碼塊不能渲染任何東西。相反,它允許用戶編寫任意沒有返回值的代碼。同樣,代碼塊里定義的變量可能被同一個域中的代碼段使用。像foreach循環(huán)體里定義的變量只能被容器內(nèi)的代碼訪問,而定義在視圖頂部的變量可以被同視圖中的代碼塊和代碼段訪問。11.8.4布局
Razor通過layouts維護網(wǎng)站外觀布局的一致性。使用布局,單個視圖定義了整個網(wǎng)站的布局和樣式,就像模板一樣被其他視圖使用。布局模板包含基本的標簽(Scripts,CSS以及諸如導(dǎo)航和內(nèi)容容器等HTML元素),可以指定渲染視圖內(nèi)容的位置。網(wǎng)站中的每個視圖可以引用這個布局,包括內(nèi)容和位置。11.8.4布局
Razor的基本布局文件(_Layout.cshtml)如下:<!DOCTYPEhtml><htmllang="en"><head><metacharset="utf-8"/><title>@View.Title</title></head><body><divclass="header">@RenderSection("Header")</div>@RenderBody()<divclass="footer">@RenderSection("Footer")</div></body></html>11.8.4布局
布局文件包含HTML內(nèi)容,它定義了整個網(wǎng)站的HTML結(jié)構(gòu)。依賴于一些變量(如@View.Title)和幫助函數(shù)(如@RenderSection([SectionName])和@RenderBody())來進行單個的視圖交互。一旦Razor布局定義完成,視圖引用當(dāng)前布局以后就可以定義自己的段落內(nèi)容。下面的視圖頁面引用了前面的布局文件Layout.cshtml:@{Layout="_Layout.cshtml";}@sectionHeader{<h1>EbusinessOnlineAuctionSite</h1>}@sectionFooter{Copyright@DateTime.Now.Year}<divclass="main">Thisisthemaincontent.</div>Razor布局和內(nèi)容視圖組合在一起,每一塊定義了頁面的特定部分。當(dāng)所有的小塊組合在一起時,就可以展示出一個完整的頁面。11.8.4布局
Razor幫助函數(shù)的使用:@RenderBody當(dāng)創(chuàng)建基于_Layout.cshtml布局頁面的視圖時,視圖的內(nèi)容會和布局頁面合并,而合并新創(chuàng)建視圖的內(nèi)容會通過_Layout.cshtml布局頁面的@RenderBody()方法呈現(xiàn)在標簽之間。@RenderPage呈現(xiàn)一個頁面。比如網(wǎng)頁中固定的頭部可以單獨放在一個共享的視圖文件中,然后在布局頁面中通過這個方法調(diào)用,用法為:@RenderPage(“/Views/Shared/Header.cshtml”)。@RenderSection布局頁面還有節(jié)(Section)的概念,也就是說,如果某個視圖模板中定義了一個節(jié),那么可以把它單獨呈現(xiàn)出來。11.8.5 部分視圖
盡管布局通過重用部分HTML代碼來維護網(wǎng)站外觀布局的一致性,但是仍舊需要一些特定的方法來處理一些特殊的場景,而其中最常見的就是在網(wǎng)站的多個位置顯示高級別的信息。例如,Ebusiness交易網(wǎng)站可能要顯示一個交易列表——只顯示交易的名稱、當(dāng)前價格和一段摘要,而且可能需要在網(wǎng)站的多個頁面顯示,如搜索頁面,網(wǎng)站的主頁。ASP.NETMVC通過部分視圖可以支持這些場景需要。下面的這個代碼就演示了上面提到的交易列表的部分視圖代碼結(jié)構(gòu):@modelAuction<divclass="auction"><ahref="@Model.Url"><imgsrc="@Model.ImageUrl"/></a><h4><ahref="@Model.Url">@Model.Title</a></h4><p>CurrentPrice:@Model.CurrentPrice</p></div>11.8.5 部分視圖
為了以后使用這個部分視圖,可以直接保存為一個單獨的視圖文件(例如,/Views/Shared/Auction.cshtml),然后用ASP.NETMVC自帶的HTML幫助方法(這個方法可以把部分視圖作為另外一個視圖的部分內(nèi)容進行渲染)來調(diào)用它。下面的代碼會在Auction集合里進行迭代,然后使用部分視圖渲染每個交易信息。@modelIEnumberable<Auction><h2>SearchResults</h2>@foreach(varauctioninModel){@Html.Partial("Auction",auction)}注意,Html.Partial()幫助方法的第一個參數(shù)是一個視圖的名字,并不包含擴展文件名后綴。這是因為Html.Partial()幫助方法的基礎(chǔ)是強大的ASP.NETMVC視圖引擎。渲染部分視圖的方式與控制器中操作方法調(diào)用View()方法返回視圖結(jié)果的過程十分類似。引擎使用視圖名稱去査找并渲染特定的視圖。兩者唯一的區(qū)別就是部分視圖表示的是大視圖的一部分內(nèi)容。Html.Partial()幫助方法的第二個參數(shù)接受的是部分視圖的模型。而這個參數(shù)并不是必須的,如果不指定,就使用調(diào)用Html.Partial()的視圖的模型。例如,如果第二個參數(shù)沒傳遞,則ASP.NETMVC會傳遞原來View視圖的Model屬性。11.8.6 顯示數(shù)據(jù)
MVC架構(gòu)依賴于模型、視圖和控制器,雖然彼此分離,但是確實三者工作在一起。這種關(guān)系中,控制器充當(dāng)了“交警”的角色,協(xié)調(diào)系統(tǒng)的不同部分執(zhí)行不同的應(yīng)用處理邏輯。這些處理過程可能會返回一些特定的數(shù)據(jù)給用戶。但是,顯示數(shù)據(jù)的工作卻不屬于控制器,這是視圖的職責(zé)。那么,控制器如何與視圖進行交互呢?ASP.NETMVC提供了兩種方式在MVC不同部分之間傳遞數(shù)據(jù):ViewData和TempData。11.8.6 顯示數(shù)據(jù)
HomeControllers.cs。publicActionResultAbout(){ViewData["Username"]=User.Identity.Username;ViewData["CompanyName"]="Ebusiness:TheASP.NETMVCDemoSite"ViewData["CompanyDescription"]="EbusinessistheworldleaderinASP.NETMVC";returnView("About");}在視圖文件中使用這個值,如About.cshtml文件里的代碼:<h1>@ViewData["CompanyName"]</h1><div>@ViewData["CompanyDescription"]</div>11.8.6 顯示數(shù)據(jù)
通過ViewBag訪問ViewData的值ViewBag只是把ViewData簡單包裝成一個dynamic的新類型,與var不同的是,它不會在編譯時檢查類型,而是繞過編譯時的類型檢查,改為在運行時解析這些操作的動態(tài)對象。視圖模型除了基本的字典行為,ViewData對象也提供了Model屬性,這是請求的原始模型對象。強類型視圖在默認情況下,Model屬性可以在Razor視圖里訪問,并且是動態(tài)類型,這意味著可以直接訪問這個類型,而不需要知道它的準確類型。但是,考慮到C#語言的靜態(tài)屬性以及VisualStudio對Razor視圖強大的智能感知支持,最好還是明確指定頁面模型的具體類型。11.8.7 使用HtmlHelper
在使用A中的MVC框架開發(fā)時,當(dāng)使用HTML語言寫前臺碼或設(shè)計UI時,有一個特殊的控制器類可以很大程度的幫助我們,提高寫代碼的效率和提高數(shù)據(jù)綁定的穩(wěn)定性,它就是HTMLhelper類。HtmlHelper類位于System.Web.MVC.Html命名空間下。它是MVC框架封裝好的幫助類,主要用于前臺的控件顯示和數(shù)據(jù)綁定。11.9 模型
從技術(shù)角度來看,模型由屬性暴露數(shù)據(jù)和方法封裝業(yè)務(wù)邏輯的類組成。這些類大小各異,最常見的例子就是“數(shù)據(jù)模型”或者“域模型”,它們的首要職責(zé)就是負責(zé)管理數(shù)據(jù)。在實際的編程過程中,可以簡單認為模型就是要保存,創(chuàng)建,更新和刪除的對象。例如,下面的代碼展示了Auction類這個模型:publicclassAuction{publiclongId{get;set;}publicstringTitle{get;set;}publicstringDescription{get;set;}publicdecimalStartPrice{get;set;}publicdecimalCurrentPrice{get;set;}publicDateTimeStartTime{get;set;}publicDateTimeEndTime{get;set;)}11.10 訪問控制
安全和身份驗證是每個Web應(yīng)用程序必須考慮的問題,有時候需要對某些頁面進行身份驗證,有時候需要對整個網(wǎng)站進行身份驗證,有時候要對特定的用戶(或者用戶組)進行限制以阻止未授權(quán)的用戶訪問網(wǎng)站。傳統(tǒng)的ASP.NET網(wǎng)站添加身份驗證的方式就是在web.config中添加設(shè)置。但是ASP.NETMVC不支持這種方式。ASP.NETMVC程序依賴于控制器操作,而不是物理頁面。相反,ASP.NETMVC框架提供
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 線上教學(xué)結(jié)業(yè)課件大綱
- 培訓(xùn)課后知識點回顧課件
- 2025年四川省遂寧市中考語文真題(附答案解析)
- 培訓(xùn)講座銷售墓地知識課件
- 2025年航空航天傳感器設(shè)備采購、安裝與檢測服務(wù)協(xié)議
- 2025年度綠色建材環(huán)保型戶外雨棚設(shè)計、制造及專業(yè)安裝服務(wù)協(xié)議
- 2025年度政府機關(guān)IT系統(tǒng)安全加固與維護服務(wù)合同
- 2025年健身房裝修工程后期保障與維護責(zé)任書
- 2025年智能制造業(yè)工傷賠償補償協(xié)議書范本
- 2025年智能房貸代理服務(wù)委托協(xié)議范本
- (完整版)鋼結(jié)構(gòu)廠房施工組織設(shè)計(含土建)
- 機關(guān)食堂食品安全風(fēng)險防控工作指南
- T/CHTS 10155-2024公路多脈沖整流遠程直流供電系統(tǒng)技術(shù)規(guī)范
- 利用機器學(xué)習(xí)技術(shù)開發(fā)社區(qū)老年人跌倒風(fēng)險預(yù)測模型
- 酒店寵物協(xié)議書
- 聘請合唱團老師合同協(xié)議
- 2025年公共行政管理考試試卷及答案
- 非創(chuàng)傷性軟組織疼痛急診管理專家共識解讀
- 小學(xué)生作業(yè)書寫規(guī)范要求
- 電鍍防火知識培訓(xùn)課件
- 電石爐巡檢工課件
評論
0/150
提交評論