




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ASP.NETMVC框架是微軟推出的一種使用MVC進(jìn)行開發(fā)的應(yīng)用,MVC的全稱MVCASP.NETWebForm不一樣的一種編程模型。ASP.NETMVC框架ASP.NETWebForm員都了解的設(shè)計(jì)模式,其整體結(jié)構(gòu)如圖31.1所示。31.1MVC模式組ASP.NETMVC音樂商店是微軟推出的一個(gè)用于MVC學(xué)習(xí)的,完全基于VisualStudio2010和ASP.NETMVC框架進(jìn)行開發(fā)。在實(shí)際開始這個(gè)之前,本小節(jié)將首先對(duì)該音樂進(jìn)行預(yù)覽,介紹的模塊功能,以及的操作流程,然后介紹一下開始開發(fā)之前的開發(fā)環(huán)境準(zhǔn)備,并進(jìn)行一些初步預(yù)覽音樂商店31.2ASP.NETMVC31.3樂添加到購(gòu)物車,如圖31.4所示。31.431.5用戶可以單擊“”進(jìn)入到用戶窗口,在該窗口中一個(gè)新的用戶,如圖31.7所示。圖31.7用戶窗當(dāng)用戶成功的之后,那么再次提交購(gòu)物車的話,將進(jìn)入到發(fā)運(yùn)與支付窗口,在該31.831.8提交完成確認(rèn)頁系統(tǒng)架構(gòu)在介紹了音樂商店的使用步驟后,本節(jié)將討論一下該的整體架構(gòu)。整個(gè)利用話(比如MVC1.0的話),可能會(huì)出現(xiàn)一些不兼容的現(xiàn)象。視視ASPX母版角色31.9音樂商店系統(tǒng)架ASP.NETMVCWeb應(yīng)用程序時(shí)的主要架構(gòu),在開始進(jìn)行音樂的設(shè)計(jì)之前,可以先使用EntityFramework進(jìn)行模型到數(shù)據(jù)庫的建模系統(tǒng)數(shù)據(jù)庫設(shè)531.10Album表:用于音樂專輯,以AlbumId作為其主鍵,許多其他的表該主Cart表:用于購(gòu)物車信息31.1Album表字段描字段類描NNN來自表中的藝術(shù)家N專輯標(biāo)numeric(10,N價(jià)Y表31.2表字段描字段類允許空描NY31.3Genre表字段描字段類允許空描NYY31.4Cart表字段描字段類允許空描NNN專輯編NN31.5Order表字段描字段類允許空描NN訂單日Y用戶名Y姓Y名Y地Y城Y省YY國(guó)YY電numeric(10,Y明細(xì)匯31.6OrderDetail字段類允許空描NN訂單idN專輯編N訂單數(shù)numeric(10,N單關(guān)于這些表的詳細(xì)信息,可以參考示例項(xiàng)目的App_Data文件夾下的MvcMusicStore.mdf文件,可以直接在VisualStudio中打開該文件,在服務(wù)器資源管理器系統(tǒng)文 結(jié)因?yàn)锳SP.NETMVCFramework的開發(fā)對(duì)于文件和有一些約定的要求,因此在VisualStudio2010ASP.NETMVC項(xiàng)目時(shí),會(huì)默認(rèn)的創(chuàng)建一些文件夾和文件。VisualStudio20102ASP.NETMVC的模板,如圖31.11所示。31.11ASP.NETMVC項(xiàng)目模ASP.NETMVC2Web應(yīng)用程序模板將會(huì)創(chuàng)建基本的文件和結(jié)構(gòu),并添加一些基ASP.NETMVC2Web應(yīng)用程序?qū)⒅粍?chuàng)建結(jié)構(gòu),MVC音樂商店從一個(gè)空的MVC2項(xiàng)目模板開始創(chuàng)建,然后手動(dòng)編寫代碼創(chuàng)建所需要的文件,但是對(duì) 表31.7ASP.NETMVC項(xiàng) 結(jié)名描模型類用于存放和操作數(shù)據(jù)庫,一般用于存放EntityFramework生成的類或者是自 ASP.NETMVC音樂商店自然保留了這種 在一些文件夾下會(huì)有多個(gè)不同的子文件夾,解決方案資源管理器視圖如圖31.12所示。
ASP.NETMVC
圖31.12ASP.NET 式的軟件開發(fā)框架將表現(xiàn)層與邏輯層進(jìn)行物理的,使得開發(fā)人員可以在控制器或者是31.12的結(jié)構(gòu)中,Global.asax項(xiàng)目時(shí),應(yīng)該要統(tǒng)籌項(xiàng)目的文件結(jié)構(gòu),然后在Global.asax中定義路由表,因?yàn)镸VCUrlASPX文件,而是統(tǒng)一交由控制器進(jìn)行處理(在后面的內(nèi)容中會(huì)進(jìn)行進(jìn)一步的介紹)MVC音樂商店中,使用了默認(rèn)的路由結(jié)構(gòu),Global.asax中publicpublicclassMvcApplication:{publicstaticvoidRegisterRoutes(RouteCollection{//映射指定的Url并指定路由的默認(rèn) URL和參new{controller="Home",action=idUrlParameter.Optional }protectedvoid{ }}Url解析規(guī)則的,在這里面可以使用正則表達(dá)式來表現(xiàn)復(fù)雜的結(jié)構(gòu),默認(rèn)的{controller}/{action}/{id}表示一個(gè)指定的控制器下面的一個(gè)行id參數(shù)值。如果路由參數(shù)不正確,則導(dǎo)航到路由的默認(rèn)值指定的參數(shù)中。創(chuàng)建母版頁和CSSASP.NETMVC的視圖所ViewShared的子文件夾,然后右擊該文件夾,選擇“添加|新建項(xiàng)”子文件夾,在彈出的添加新項(xiàng)窗口中選擇“MVC2視圖母版頁”,如31.13<%@<%@MasterLanguage="C#"Inherits="System.Web.Mvc.ViewMasterPage"<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0 <html<head<headid="Head1" ceHolderID="TitleContent"runat="server"<div<div<ahref="/">ASP.NETMVC音樂商店<ul<liclass="first"><ahrefid="current">首頁<li><ahref="/Store/">商店<%--使用 <%--使用Store中的 <% ","Store");<div ceHolderID="MainContent"runat="server"<div使用<a ">ASP.NETMVC2構(gòu)建由第一行的代碼可以看到,MVCSystem.Web.Mvc.ViewMasterPage允許客戶頁面定制標(biāo)題。特別注意到在代碼中使用了Html.RenderActon()方法,該方法用于呈現(xiàn)一個(gè)用戶控件,在代碼中指定了CartSummary.ascx,位于View文件夾下的控件。在后面的內(nèi)容中會(huì)介紹這2個(gè)用戶控件的實(shí)現(xiàn)。定了的Logo以及一些樣式的設(shè)置。31.13ASP.NET視圖母版使用EntityFramework創(chuàng)建實(shí)體模型由于在示例中將使用EntityFramework這個(gè)ORM框架進(jìn)行數(shù)據(jù)庫,因ADO.NETModels文件夾,選擇“添加|新Studio2010將進(jìn)入到實(shí)體數(shù)據(jù)模型設(shè)計(jì)向?qū)Т翱?,如圖31.14所示。31.14選擇模型內(nèi)容31.1431.15選擇模型內(nèi)所有的表,如圖31.16所示。31.16模型名空間要指定將使用的模型的默認(rèn)命名空間,這里使用默認(rèn)值即可,在設(shè)置完成后單擊“完成”按鈕,VisualStudio2010將進(jìn)入到模型視圖窗口,如圖31.17所示。31.17ADO.NET的實(shí)體模型,在后面的章節(jié)中將根據(jù)系統(tǒng)生成的實(shí)體模型當(dāng)用戶首次進(jìn)入時(shí),將進(jìn)入到首頁窗口,在該窗口中有導(dǎo)航欄,流派選擇,有最首頁控制器實(shí)MVCVisualStudio2010創(chuàng)建件夾和Index.aspx頁面。Index.aspx5個(gè)音HomeControllerIndexAction,然后返回給視圖最近銷售的5個(gè)專輯的數(shù)據(jù),因此在控制器中編寫了如下所示的代碼:publicpublicclassHomeController:MusicStoreEntitiesstoreDB=newpublicActionResult varalbums return privateList<Album>GetTopSellingAlbums(int使用LINQ語法返回OrderDetails5return.OrderByDescending(a=>定義了動(dòng)作方法可供返回的多個(gè)子類,代碼中返回了ViewResult子類,用來表示HTML中指定參數(shù)為5條,表示查詢OrderDetails實(shí)體中的前5條記錄。創(chuàng)建首頁Index行為方法內(nèi)部右擊鼠標(biāo),從彈出的菜單中選擇“添加視圖”菜31.18所示的添加視圖窗口,在該窗口中可以指定母版頁,母版頁占位符ID號(hào),以及指定強(qiáng)類型的視圖數(shù)據(jù)類。31.18添加視圖窗當(dāng)添加完視圖后,會(huì)在與控制器名稱(Controller后綴后的名稱)View文件夾下的子文件夾中創(chuàng)建相應(yīng)的Index.aspx文件,通過使用<%%><%@<%@PageLanguage="C#" <asp:ContentID="Content1"ContentASP.NETMVC音樂商<asp:ContentID="Content2"Content <div </em音樂列表<ulid="album-<%foreach(varalbumin{ ,使用Url.Action語法--<ahref="<%Url.Action("詳細(xì)Store",new{id=album.AlbumId})%>"><imgalt="<%:album.Title%>"src="<%:album.AlbumArtUrl%>"<span><%:album.Title<%}由代碼可以看到,在TitleContent這個(gè)標(biāo)題占位符中,寫入了頁面的標(biāo)題,在MainContent這個(gè)母版頁占位符內(nèi)部,通過循環(huán)的方式遍歷Model中的內(nèi)容。由于在控制器中返回了List<Album>,而視圖頁又派生自System.Web.Mvc.Viege<IEnumerableModel5Url.Action瀏覽音樂專輯列表,音樂流派的這個(gè)列表是在\Views\Store文件夾下的Genre.ascx用戶控件中<%@Control Models.Genre>>"%><ul<%foreach(vargenreinModel){<%--定位到Store控制器的Browse()方法,傳入?yún)?shù)Genre為流派名稱<%:Html.ActionLink(genre.Name,"Browse","Store",new{Genre=genre.Name},null)%><%}代碼指定的模型是MvcMusicStore.Models.Genre列表,因此在循環(huán)遍歷Model中的Genre對(duì)象時(shí),創(chuàng)建了,ActionLink指定Store控制器的Browse()方法,并傳入了GenreName屬性。這時(shí)需要在\ControllersStoreController的控制器,并在該控制器中添加一個(gè)Browse()行為,具體代碼如下所示。publicActionResultBrowse(string{vargenreModel=.Single(g=>g.Name==varviewModel=new{Genre=Albums=return //返回ViewResult實(shí)}專輯傳到視圖中進(jìn)行顯示,為了方便傳輸,這里定義了一個(gè)名為StoreBrowseViewModel的類,用來保存流派及流派對(duì)應(yīng)的專輯,具體實(shí)現(xiàn)代碼后面給出),然后實(shí)例化一個(gè)StoreBrowseViewModel這個(gè)視圖模型對(duì)象,將值賦給該對(duì)象。在項(xiàng)目中創(chuàng)建一個(gè)名為ViewModelspublicpublicclass{publicGenreGenre{get;set;}publicList<Album>Albums{get;set;}}StoreBrowseStoreBrowse()方法的代碼中單擊鼠標(biāo)右鍵,從彈出的菜單中選擇“添加視圖”菜單項(xiàng),將彈出如圖31.19<%@<%@PageLanguage="C#"MasterPageFile="~/Views/Shared/Site.Master" <asp:ContentID="Content1"Content<asp:ContentID="Content2"Content<div<h3><emModel.Genre.Nameem>音樂冊(cè)<ulid="album-<%foreach(varalbuminModel.Albums){<ahref="<%:Url.Action("Details",new{id=album.AlbumId})%>"><imgalt="<%:album.Title%>"src="<%:album.AlbumArtUrl%>"/><span><%:album.Title<%}并指定標(biāo)題和專輯Url,該指向Details()方法,并傳入一個(gè)AlbumId參數(shù)31.19創(chuàng)建強(qiáng)類型視瀏覽音樂明細(xì)的單價(jià),以及添加到購(gòu)物車的按鈕,該行為方法的代碼實(shí)現(xiàn)在Store控制器中,在該控制器中添加一個(gè)Details()方法,代碼如下所示。publicpublicActionResultDetails(int {varalbumstoreDB.Albums.Single(aa.AlbumIdid);returnView(album); //返回ViewResult對(duì)象}Album>”,然后編輯位于\View\StoreDetails.aspx文件,該文件從模型中獲取<%@PageLanguage="C#"MasterPageFile="~/Views/Shared/Site.Master"<%@PageLanguage="C#"MasterPageFile="~/Views/Shared/Site.Master" ge<MvcMusicStore.Models.Album>"%><%--標(biāo)題<asp:ContentID="Content1"ContentModel.Title<asp:ContentID="Content2"Content<%:Model.Title<p><%--專輯標(biāo)題和Url<divid="album-<%:Model.Genre.Name<%: .Name<%:String.Format("{0:F}",Model.Price)<pclass="button添加到購(gòu)物車按鈕<%:Html.ActionLink("添加到購(gòu)物車","AddToCart", new{id=Model.AlbumId},由代碼可以看到,Detail.aspx派生自Viege<MvcMusicStore.Models.Album>,因此ModelAlbum類型的對(duì)象,通過獲取該對(duì)象的信息來得到專輯的詳細(xì)信息,使Html.xxxASP.NETMVCHtml至此已經(jīng)研究了MVC音樂商店的音樂列表顯示功能,可以看到整個(gè)實(shí)現(xiàn)流程是先創(chuàng)31.20所示的流程: 31.20MVC開發(fā)流在上面的圖中,開發(fā)人員可以使用測(cè)試先行的TDD開發(fā)模式,先編寫測(cè)試用例,然默認(rèn)的管理員用戶是Administrator,為password123!,當(dāng)用戶使用這個(gè)賬號(hào)進(jìn)入后,就可以進(jìn)入到音樂管理列表窗口,如圖31.21所示。31.21管理音樂列如圖31.22所示。31.22編輯音樂?;诮巧尿?yàn)航到用戶登錄窗口,如圖31.23所示。31.23用戶登錄窗StoreManagerController的控制器,該控制器使用.NET的特[Authorize(Roles[Authorize(Roles=publicclassStoreManagerController:{…}戶才能該控制器。開發(fā)人員可以使用VisualStudio2010的管理工具創(chuàng)建和管理角色,選擇菜單“項(xiàng)目/ASP.NET配置”命令即可打開如圖31.24所示的ASP.NET管圖31.24ASP.NET管理工具管理角開發(fā)人員可以使用ASP.NET的成員和角色技術(shù)創(chuàng)建一個(gè)自定義的登錄頁面,賦予相ASP.NETMVC登錄驗(yàn)證窗口來實(shí)現(xiàn)登錄驗(yàn)證,由publicpublicActionResult{varalbums=return}ViewDataModel屬性來獲取強(qiáng)類型的對(duì)象,<%@PageTitle=""Language="C#"<%@PageTitle=""Language="C#" Album>>"%><asp:ContentID="Content1"Content索<asp:ContentID="Content2"Content<%foreach(variteminModel){Html.ActionLink("編輯Editnewid=item.AlbumIdHtml.ActionLink("刪除Deletenewid=item.AlbumId<%--使用.NET擴(kuò)展方法擴(kuò)展HtmlHelper類<td><%:Html.Truncate(item.Title,25)<td><%: .Name,25)<td><%:item.Genre.Name<%}<p>新建音樂專輯Html.ActionLink("新建CreateHtml.ActionLink()namespaceMvcMusicStore.HelperspublicnamespaceMvcMusicStore.HelperspublicstaticclassHtmlHelpers//為HtmlHelper加一個(gè)擴(kuò)展方法,使得可以截?cái)嘀付ㄩL(zhǎng)度的字符publicstaticstring(thisHtmlHelperhelper,stringinput,intif(input.Length<=returnreturninput.Substring(0length否則進(jìn)行截<addnamespace="System.Web.Mvc"<addnamespace="System.Web.Mvc.Ajax"<addnamespace="System.Web.Mvc.Html"<addnamespace="System.Web.Routing"<addnamespace="MvcMusicStore.Helpers"編輯音樂publicpublicActionResultEdit(int{varviewModel=new{Album=storeDB.Albums.Single(a=>a.AlbumId==id),Genres=storeDB.Genres.ToList(),s= return }Edit()IdId值相關(guān)聯(lián)的音樂專輯,流派列表和藝術(shù)家列TextBox31.22中可以看到,還當(dāng)用戶單擊“保存”按鈕時(shí),HTMLHTTP-POST的動(dòng)作,將編輯結(jié)果返回到數(shù)據(jù)庫中。那么在控制器中需要一個(gè)實(shí)現(xiàn)了HTTP-POST的Edit的行為方法。ASP.NETMVC框架允許開發(fā)人員很容易的為2個(gè)Edit()方法根據(jù)不同的邏輯自動(dòng)調(diào)用到相POST提交方式。ASP.NETMVCHTTP-GET或者是HTTP-POST來自動(dòng)決定調(diào)用哪個(gè)方法,Edit的Post版本如下代碼所示。]//publicActionResultEdit(intid,FormCollection{//獲取指定Id的varalbum=storeDB.Albums.Single(a=>a.AlbumId==id);{//Save//UpdateModel()方法根據(jù)formValues中綁定的//更新album對(duì)象,然后保存到數(shù)據(jù)庫中。UpdateModel(album,"Album");return //重定向到Index}{varviewModelnewStoreManagerViewModel{Album=Genres=storeDB.Genres.ToList(),s= return }}上面的代碼首先從獲取到指定Id的實(shí)體對(duì)象,然后調(diào)用UpdateModel<%@PageLanguage="C#"MasterPageFile="~/Views/Shared/Site.Master" <asp:ContentID="Content1"Content 編輯Model.Album.Title<asp:ContentID="Content2"Content <% Validation();<%using(Html.BeginForm())Html.ValidationSummary(true顯示驗(yàn)證概述欄<%--調(diào)用Html模板顯示編輯列表框<%:Html.EditorFor(model=>new s= s,Genres=Model.Genres})<inputtype="submitvalue="保存提交保存<%}Html.ActionLink("返回到列表Index返回到列表代碼使用了一個(gè)EditorFor()方法,該方法將一個(gè)編輯模板來提供操作界面ASP.NETMVC2EditorFor3種方式,這種方式是使用一個(gè)在設(shè)計(jì)時(shí)已經(jīng)定義好的模板,該方板因?yàn)槭褂枚ㄖ频哪0迥軌蚨ㄖ埔恍┯脩糨斎肟丶热鐚⑽谋究蜉斎敫臑槭褂肈ropDownList代替,Album.ascx是一個(gè)專門用于放置到其他視圖中的局部視圖,可以在VisualStudio2010中使用添加視圖的方式創(chuàng)建局部視圖,如圖31.25所示。31.25創(chuàng)建分部視由于這個(gè)視圖要被嵌入到現(xiàn)有的視圖中,因此還要去掉相關(guān)的Form,本例對(duì)由DropDownList控件來實(shí)現(xiàn)的,代碼如下所示。<%@ControlLanguage="C#"Inherits="System.Web.Mvc.ViewUserControl<MvcMusicStore.Models.Album>"<%@ControlLanguage="C#"Inherits="System.Web.Mvc.ViewUserControl<MvcMusicStore.Models.Album>"%><script<script<script<divclass="editor-Ajax.js"MvcAjax.js"<%:Html.LabelFor(model=>model.GenreId)<divclass="editor-<%:newSelectList(ViewData["Genres"]asIEnumerable,"GenreId","Name",Model.GenreId))%><%:Html.ValidationMessageFor(model=>model.GenreId)<divclass="editor-<divclass="editor-<%: newSelectList(ViewData[" s"]asIEnumerable, Id","Name",Model. <%:Html.ValidationMessageFor(model=> Id)<divclass="editor-<%:Html.LabelFor(model=>model.Title)<divclass="editor-<%:Html.TextBoxFor(model=>model.Title)<%:Html.ValidationMessageFor(model=>model.Title)<divclass="editor-<%:Html.LabelFor(model=>model.Price)<divclass="editor-<%:Html.TextBoxFor(model=>model.Price,String.Format("{0:F}",Model.Price))%><%:Html.ValidationMessageFor(model=>model.Price)<divclass="editor-<%:Html.LabelFor(model=>model.AlbumArtUrl)<divclass="editor-<%:Html.TextBoxFor(model=>model.AlbumArtUrl)<%:Html.ValidationMessageFor(model=>model.AlbumArtUrl)在代碼中可以看到,去掉了Html.BeginForm()方法,首先添加了對(duì)一些用于客戶端驗(yàn)證用的Ajax庫,在稍后將會(huì)詳細(xì)的討論。接下來在流派和藝術(shù)家中使用了2個(gè)在Edit.ascx頁面中,已經(jīng)定義了<%Html.EnableValidation();%>代碼,表示將啟ASP.NETMVCUI層,如果每一次驗(yàn)證都要進(jìn)AJAX技術(shù)以異步的方式發(fā)送回服務(wù)器端進(jìn)行驗(yàn)證,再返回結(jié)果,這樣便無需進(jìn)行整頁的刷新,效果如圖31.26所示。31.26基于客戶端AJAX的表單驗(yàn)指定顯示的Label時(shí),也沒有使用任何的硬編碼的文本。那么這些關(guān)于驗(yàn)證和定義的代碼是寫在哪里?其實(shí)都是寫在一個(gè)局部的模型類中。由于ADO.NETEntityFramework生成了為了添加聲名性的驗(yàn)證和顯示字段,可以增加一個(gè)MetaDataType類,在該類指定的類型中添加驗(yàn)證邏輯,以Album為例,在Models文件夾中創(chuàng)建了一個(gè)局部類Album,并創(chuàng)建了一個(gè)嵌套類AlbumMetaData,如下代碼所示。 usingSystem.Web.Mvc;{publicpartialclassAlbum{下面的類是用于為Album添加驗(yàn)證邏輯的[Bind(Exclude="AlbumId")]publicclassAlbumMetaData{publicobjectAlbumId{get;set;} publicobjectGenreId{get;set; public Id{get;set;[Required(ErrorMessage必須指定音樂冊(cè)標(biāo)題")] publicobjectTitle{get;set; publicobjectAlbumArtUrl{get;set;//指定Reiquired并指定價(jià)格范圍[Required(ErrorMessage價(jià)格是必須的")][Range(0.01,100.00,ErrorMessage="價(jià)格必須在0.01和100.00")] publicobjectPrice{get;set;}}}ponentModel.DataAnnotations命名空間。使用MetadataType通過在模型中添加性的驗(yàn)證機(jī)制,然后使用AJAX的客戶端驗(yàn)證機(jī)制,使得一旦ASP.NETMVC中購(gòu)添加到購(gòu)物車<p<pclass="button添加到購(gòu)物車按鈕Html.ActionLink("添加到購(gòu)物車"AddToCartnew{id=Model.AlbumId},在控制器ShopCartController中的AddToCart()方法代碼如下所示。publicActionResultAddToCart(intid){從數(shù)據(jù)庫中返回Album對(duì)varaddedAlbum=.Single(album=>album.AlbumId==varcart= //重定向到Index中以便進(jìn) return}IDAlbum對(duì)象,然后獲取當(dāng)前因?yàn)楫?dāng)前用戶如果是未登錄的話,GetCart將獲取到一個(gè)隨機(jī)的ID,如果用戶登錄過的話,則使用一用戶名來作為ID值,Cart.GetCartId()方法的代碼如下所示。////代碼使用HttpContextBasepublicStringGetCartId(HttpContextBase{ifcontext.Session[CartSessionKeynull)//如果不存在{{,}{如果用戶未登錄,使用NewGuidIDGuidtempCartId=發(fā)送tempCartId}}return}publicstatic CartGetCart(HttpContextBase{varvarcart=new CartIdcart.GetCartId(context);//獲取購(gòu)物車IDreturncart}SessionCartSessionKey的會(huì)話是不是存在,如果不存在,用戶ID。然后ShopCart類的GetCart將實(shí)例化一個(gè)新的購(gòu)物車,并將返回的Id作為購(gòu)物車的ID號(hào),這樣在用戶登錄進(jìn)入后可以合并這個(gè)購(gòu)物車。Cart類是ShopCart類的實(shí)例,而ShopCart類是專門用來管理購(gòu)物車的一個(gè)專門的類,AddToCartID,然后將專輯加到購(gòu)物車中。publicpublicvoidAddToCart(Albumalbum)//添加到購(gòu)物{//查詢指定shop CartId的購(gòu)物車中的AlbumvarcartItem=storeDB.Carts.SingleOrDefault(c=>c.CartId==shop CartId&&c.AlbumId==if(cartItem=={cartItem=new{AlbumId=album.AlbumId,CartId=shopCartId,Count=1,DateCreated=}{購(gòu)物車數(shù)量更}代碼首先從數(shù)據(jù)庫中查找指定shopCartId和AlbumId的購(gòu)物車條目,如果不存在當(dāng)向購(gòu)物車中添加了商品之后,導(dǎo)航欄的購(gòu)物車按鈕也會(huì)顯示出購(gòu)物車中物品的數(shù)據(jù),同時(shí)頁面被導(dǎo)航到購(gòu)物車中,用戶可以選擇“從購(gòu)物車中移除”將選中的項(xiàng)目1.2731.27從購(gòu)物車中移除//AJAX//AJAX示例publicActionResultRemoveFromCart(int{獲取當(dāng)前用戶的購(gòu)物varcart= stringalbumName=.Single(item=>item.RecordId==varresults=new {MessageServer.HtmlEncode(albumName)"已經(jīng)從你的購(gòu)物車中移除了.",CartTotal=cart.GetTotal(),CartCount=cart.GetCount(),DeleteId=idreturn}Ajax.ActionLink("從購(gòu)物車中移除RemoveFromCart",new{id=item.RecordId},newAjaxOptions{OnSuccess="handleUpdate"Ajax.ActionLinkHtml.ActionLinkHtml.ActionLink會(huì)產(chǎn)<scripttype="text/javascript">function<scripttype="text/javascript">functionhandleUpdate(context){varjson=vardata=Sys.Serialization.JavaScriptSerializer.//更新返回的JSON數(shù)據(jù)更新頁面元$('#row-'+$('#cart-status').text('Cart('+data.CartCount+$('#cart-total').text(data.CartTotal顯示匯}代碼首先獲取JSON數(shù)據(jù)然后進(jìn)行反序列化,然后將反序列化后的數(shù)據(jù)輸出到頁面元并顯示出了成功更新的消息,如圖31.28所示。31.28提交購(gòu)擊“完成”按鈕,就可完成訂單的提交,如圖31.29所示。31.29完成訂單提Html.ActionLink("提交AddressAndPayment類是一個(gè)需要驗(yàn)證的方法,因此使用了Authorize特性進(jìn)行修飾,如下所示。publicclassCheckoutController:{MusicStoreEntitiesstoreDB=newMusicStoreEntities();conststringPromoCode=" }方法,GET的方法僅返回一個(gè)視圖,并沒有返回任何有效的數(shù)據(jù),因?yàn)檫@是要求用戶填入信息的。POST的方將用戶的輸入提交到數(shù)據(jù)庫中,這2個(gè)方法的代碼如下所示。publicActionResult{return}publicActionResultAddressAndPayment(FormCollection{varorder=newOrder();TryUpdateModel(order);//更新order{if(string.Equals(values["PromoCode"],PromoCode,parison.OrdinalIgnoreCase)==false){{returnView(order);//如果promoCode不是}{order.Username=User.Identity.Name;order.OrderDate=DateTime.Now;varcart=Shop new{id=order.OrderId});}}{returnView(order);}}POST的方法將獲取表單中輸入的值,創(chuàng)建一個(gè)Order對(duì)象,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 橡膠量子橡膠材料基礎(chǔ)研究創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書
- 電影票團(tuán)購(gòu)匯創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書
- 汽車線下廣告精準(zhǔn)投放創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書
- 新人入車基礎(chǔ)知識(shí)培訓(xùn)課件
- 助理員崗位知識(shí)培訓(xùn)課件
- 唐詩三百首全文及現(xiàn)代白話譯文
- 社會(huì)適應(yīng)能力測(cè)評(píng)量表及評(píng)分方法
- 酒店餐飲部員工安全培訓(xùn)計(jì)劃
- 四川省高一數(shù)學(xué)期末考試題及解析
- 高職院校專業(yè)教學(xué)計(jì)劃制定
- 電土施表1-6 專業(yè)綠色施工、節(jié)能減排管理措施和實(shí)施記錄
- 野生植物資源學(xué)習(xí)題及參考答案
- 有限空間作業(yè)安全管理協(xié)議
- 跨省戶口網(wǎng)上遷移告知單
- ISO45001職業(yè)健康安全管理體系課件
- 中職《語文》課程思政開發(fā)與建設(shè)方案
- 新生兒遺傳代謝病篩查陽性兒管理課件
- 校服采購(gòu)?fù)稑?biāo)方案
- 臨滄市市級(jí)單位遴選(選調(diào))考試試卷真題及答案2022
- 工程質(zhì)量管理處罰制度細(xì)則
- 2023年湖北孝感市安陸市屬國(guó)有企業(yè)招聘筆試參考題庫附帶答案詳解
評(píng)論
0/150
提交評(píng)論