說明教案sql配套aspnet mvc itcastmalun_第1頁
說明教案sql配套aspnet mvc itcastmalun_第2頁
說明教案sql配套aspnet mvc itcastmalun_第3頁
說明教案sql配套aspnet mvc itcastmalun_第4頁
說明教案sql配套aspnet mvc itcastmalun_第5頁
已閱讀5頁,還剩141頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、北京傳智播客教育 MVC 進階講師:馬 倫準備工作課程安排:ORMAspNet MVC開發(fā)環(huán)境:VS2010SqlServer2008/2005 MVC3.0 Razor MVC4.0 預覽版已經(jīng)發(fā)布,主講MVC3.0【包括WebForm的視圖引擎和Razor視圖引擎】官網(wǎng) 知識儲備自動屬性隱式類型 var對象初始化器與集合初始化器匿名類擴展方法Lambda表達式自動屬性自動屬性(Auto-Implemented Properties)C#自動屬性可以避免原來這樣我們手工聲明一個私有成員變量以及編寫get/set邏輯 /Demo: public class User public int Id

2、 get; set; public string Name get; set; public int Age get; set; 隱式類型 var var 關鍵字指示編譯器根據(jù)初始化語句右側(cè)的表達式推斷變量的類型。var s = Hello;var list = new List();var anon = new Name = Terry, Age = 34 ;var expr = from c in customers where c.City = London select c; foreach (var ul in expr ) Console.WriteLine(Uppercase:

3、0, Lowercase: 1, ul.Upper, ul.Lower);匿名類將一組只讀屬性封裝到單個對象中,而無需首先顯式定義一個類型。 類型名由編譯器生成,并且不能在源代碼級使用。 每個屬性的類型由編譯器推斷。var用來初始化屬性的表達式不能為 null、匿名函數(shù)或指針類型。var v = new Amount = 108, Message = Hello ;對象初始化器,集合初始化器 List people = new List new Person FirstName = Scott, LastName = Guthrie, Age = 32 , new Person FirstNa

4、me = Bill, LastName = Gates, test02 = 85, new Person FirstName = Susanne, Age = 32 , null, ;Person person = new Person FirstName = Scott, LastName = Guthrie, test02 = 56, ;Lambda表達式“Lambda 表達式”是一個匿名函數(shù),它可以包含表達式和語句。可用于創(chuàng)建委托。 運算符 =,該運算符讀為“goes to”。格式:(input parameters) = expression從匿名函數(shù)例子講起 delegate boo

5、l DelDemo(int a, int b);DelDemo fun = delegate(int a,int b) return a b; ;Console.WriteLine(fun(1, 3);DelDemo funLambda = (int a, int b) = a b; Console.WriteLine(funLambda(1,3);實體框架(Entity Framework)簡介簡稱EF與 MVC關系與 關系 Entity Framework 是微軟以 為基礎所發(fā)展出來的對象關系對應 (O/R Mapping) 解決方案,早期被稱為 ObjectSpace,最新版本是EF4.

6、1【CodeOnly功能得到了更好的支持】實體框架Entity Framework 是 中的一組支持開發(fā)面向數(shù)據(jù)的軟件應用程序的技術(shù)。是微軟的一個ORM框架。什么是O/R Mapping廣義上,ORM指的是面向?qū)ο蟮膶ο竽P秃完P系型數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu)之間的相互轉(zhuǎn)換。狹義上,ORM可以被認為是,基于關系型數(shù)據(jù)庫的數(shù)據(jù)存儲,實現(xiàn)一個虛擬的面向?qū)ο蟮臄?shù)據(jù)訪問接口。理想情況下,基于這樣一個面向?qū)ο蟮慕涌?,持久化一個OO對象應該不需要要了解任何關系型數(shù)據(jù)庫存儲數(shù)據(jù)的實現(xiàn)細節(jié)。EF Demo演示創(chuàng)建控制臺項目創(chuàng)建數(shù)據(jù)庫(添加表)在項目中添加“數(shù)據(jù)實體模型”在代碼中添加訪問上下文保存到數(shù)據(jù)庫的代碼,演示增刪查

7、改講解整個數(shù)據(jù)流大家自己試驗一把EF插入實體 /定義 訪問數(shù)據(jù)庫的 上下文 DemoEntities demoEntities = new DemoEntities(); Product product = new Product();/定義實體 product.ProductName = spring4G; product.SubTime = DateTime.Now; demoEntities.Product.AddObject(product);/加入上下午進行跟蹤 demoEntities.SaveChanges();/保存回數(shù)據(jù)庫步驟:定義要插入實體的變量,并依次賦值,然后交給數(shù)據(jù)庫

8、訪問上下文進行管理,最后保存回數(shù)據(jù)庫EF修改刪除修改操作只需要直接修改表實體的屬性,然后調(diào)用SaveChange方法就可以了。刪除需要調(diào)用上下文的DeleteObject方法 DemoEntities demoEntities = new DemoEntities(); var products = from c in demoEntities.Product where c.ProductId = 1 select c; var pro = products.FirstOrDefault(); pro.ProductName = hello c; demoEntities.SaveChang

9、es();追蹤EF生成的SQL腳本方法EF生成腳本最終由數(shù)據(jù)庫執(zhí)行,而截獲SQL腳本最方便的就是使用SqlServer的Profile監(jiān)測工具,不僅可以進行Sql腳本的監(jiān)控而且可以監(jiān)控腳本占用的CPU、腳本執(zhí)行時間等使用方法:Management Studio工具SqlServer Profile 然后登陸后就可以監(jiān)控當前的sqlserver執(zhí)行的SQL腳本ORM in EFEntity Framework 利用了抽象化數(shù)據(jù)結(jié)構(gòu)的方式,將每個數(shù)據(jù)庫對象都轉(zhuǎn)換成應用程序?qū)ο?(entity),而數(shù)據(jù)字段都轉(zhuǎn)換為屬性 (property),關系則轉(zhuǎn)換為結(jié)合屬性 (association),讓數(shù)據(jù)庫

10、的 E/R 模型完全的轉(zhuǎn)成對象模型,如此讓程序設計師能用最熟悉的編程語言來調(diào)用訪問。而在抽象化的結(jié)構(gòu)之下,則是高度集成與對應結(jié)構(gòu)的概念層、對應層和儲存層,以 及支持 Entity Framework 的數(shù)據(jù)提供者 (provider),讓數(shù)據(jù)訪問的工作得以順利與完整的進行。(1) 概念層:負責向上的對象與屬性顯露與訪問。(2) 對應層:將上方的概念層和底下的儲存層的數(shù)據(jù)結(jié)構(gòu)對應在一起。(3) 儲存層:依不同數(shù)據(jù)庫與數(shù)據(jù)結(jié)構(gòu),而顯露出實體的數(shù)據(jù)結(jié)構(gòu)體,和 Provider 一起,負責實際對數(shù)據(jù)庫的訪問和 SQL 的產(chǎn)生。 EDM 設計器ORM in EF發(fā)散思維:如果讓你實現(xiàn)一個ORM框架!在E

11、F中的實體數(shù)據(jù)模型(EDM)由以下三種模型和具有相應文件擴展名的映射文件進行定義。 概念架構(gòu)定義語言文件 (.csdl) - 定義概念模型。 存儲架構(gòu)定義語言文件 (.ssdl) - 定義存儲模型 映射規(guī)范語言文件 (.msl) - 定義存儲模型與概念模型之間的映射M。實體框架 使用這些基于 XML 的模型和映射文件將對概念模型中的實體和關系的創(chuàng)建、讀取、更新和刪除操作轉(zhuǎn)換為數(shù)據(jù)源中的等效操作。EDM 甚至支持將概念模型中的實體映射到數(shù)據(jù)源中的存儲過程。演示:在項目中添加一個實體類,并做插入操作。EF中操作數(shù)據(jù)庫的網(wǎng)關ObjectContext封裝 .NET Framework 和數(shù)據(jù)庫之間的

12、連接。此類用作“創(chuàng)建”、“讀取”、“更新”和“刪除”操作的網(wǎng)關。ObjectContext 類為主類,用于與作為對象(這些對象為 EDM 中定義的實體類型的實例)的數(shù)據(jù)進行交互。ObjectContext 類的實例封裝以下內(nèi)容:到數(shù)據(jù)庫的連接,以 EntityConnection 對象的形式封裝。描述該模型的元數(shù)據(jù),以 MetadataWorkspace 對象的形式封裝用于管理緩存中持久保存的對象的 ObjectStateManager 對象圖說EF圖說EFEF ModelFirst 的編程方式演示EF ModelFirst 的編程方式第一步:創(chuàng)建控制臺項目第二步:添加新建項目 實體模型第三步

13、:添加實體:Customer,添加幾個必要的測試字段第四步:添加實體之間的聯(lián)系第五步:根據(jù)模型生成數(shù)據(jù)庫腳本,并執(zhí)行sql腳本創(chuàng)建數(shù)據(jù)庫第六步:寫增刪改查來講解EF的基本使用查詢部分數(shù)據(jù)僅查詢數(shù)據(jù)庫里的指定列的數(shù)據(jù)用到知識點:匿名類、var隱式推斷、屬性初始化器 var products = from c in demoEntities.Product where c.ProductId = 1 select new c.ProductName,c.ProductId ;Lambda補充“Lambda 表達式”是一個匿名函數(shù),它可以包含表達式和語句,并且可用于創(chuàng)建委托或表達式樹類型。 Lamb

14、da 表達式的運算符 =,該運算符讀為“goes to”。= 運算符具有與賦值運算符 (=) 相同的優(yōu)先級Lambda的基本形式:(input parameters) = expression只有在 Lambda 有一個輸入?yún)?shù)時,括號才是可選的;否則括號是必需的。 兩個或更多輸入?yún)?shù)由括在括號中的逗號分隔: (x, y) = x = y有時,編譯器難于或無法推斷輸入類型。 如果出現(xiàn)這種情況,您可以按以下示例中所示方式顯式指定類型: (int x, string s) = s.Length x 使用空括號指定零個輸入?yún)?shù): () = SomeMethod()最常用的場景:Ienumable和I

15、queryable接口的Where(c=c.Id3)閱讀: 使用lambda做查詢以及排序和分頁僅查詢數(shù)據(jù)庫里的指定列的數(shù)據(jù)用到知識點:匿名類、var隱式推斷、屬性初始化器var temp = demoEntities.Product .Where(p = p.ProductId 0) .OrderBy(p = p.ProductId) .Skip(3 * 2) .Take(3) .Select(p = new p.ProductId,p.ProductName );IQueryable接口與IEnumberable區(qū)別IQueryable接口與IEnumberable接口的區(qū)別: IEnum

16、erable 泛型類在調(diào)用自己的SKip 和 Take 等擴展方法之前數(shù)據(jù)就已經(jīng)加載在本地內(nèi)存里了,而IQueryable 是將Skip ,take 這些方法表達式翻譯成T-SQL語句之后再向SQL服務器發(fā)送命令。也是延遲在我要真正顯示數(shù)據(jù)的時候才執(zhí)行。演示linq to ef中使用Ienumberable與Iqueryable的區(qū)別,要用到的SQL Server Profiler工具參考我的一篇BLOG: IQueryable接口與IEnumberable接口的區(qū)別: IEnumerable 泛型類在調(diào)用自己的SKip 和 Take 等擴展方法之前數(shù)據(jù)就已經(jīng)加載在本地內(nèi)存里了,而IQuery

17、able 是將Skip ,take 這些方法表達式翻譯成T-SQL語句之后再向SQL服務器發(fā)送命令。也是延遲在我要真正顯示數(shù)據(jù)的時候才執(zhí)行。演示linq to ef中使用Ienumberable與Iqueryable的區(qū)別,要用到的SQL Server Profiler工具參考我的一篇BLOG: Linq To EF簡單查詢:var result = from c in Entities.Customer select c;條件查詢: 普通linq寫法: var result = from c in Entities.Customer where c.Gender =w select c; L

18、ambda表達式寫法: var result = from c in Entities.Customer.Where(c =c.Gender=w); 排序分頁寫法:IQueryable cust10 = (fromcincustomersorderbyc.CustomerIDselectc).Skip(0).Take(10);左外連接:可以的連接有Join和GroupJoin方法。GroupJoin組聯(lián)接等效于左外部聯(lián)接,它返回第一個(左側(cè))數(shù)據(jù)源的每個元素(即使其他數(shù)據(jù)源中沒有關聯(lián)元素)。varquery =fromdinedm.Order_Detailsjoinorderinedm.Ord

19、ersond.OrderIDequalsorder.OrderIDselectnewOrderId = order.OrderID,ProductId = d.ProductID,UnitPrice = d.UnitPrice;練習用EF ModelFrist方式創(chuàng)建一個User表。并實現(xiàn)對User表的增刪查改(CRUD)(參考上課的例子)延遲加載延遲加載:又稱作懶加載。也就是Linq To EF并不是直接將數(shù)據(jù)查詢出來,而是要用到具體數(shù)據(jù)的時候才會加載到內(nèi)存Include是將關聯(lián)實體一塊加載ToList等可以直接將數(shù)據(jù)加載到內(nèi)存使用機制的選擇關于上下文使用注意事項不同的上下文實例來直接控制對

20、應的實體實體只能由一個上下文跟蹤管理EF上下文的ObjectStateMagner管理實體批量操作時提交數(shù)據(jù)庫的選擇延遲加載機制的選擇查詢Distinct的使用數(shù)據(jù)量大小適時的選擇是在內(nèi)存中操作還是在數(shù)據(jù)庫中操作EF 跨數(shù)據(jù)庫支持目前已有數(shù)個數(shù)據(jù)庫廠商或元件開發(fā)商宣布要支持 Entity Framework:(1) Core Lab,支持Oracle、MySQL、PostgreSQL 與 SQLite 數(shù)據(jù)庫。(2) IBM,實現(xiàn) DB2 使用的 LINQ Provider。(3) MySQL,發(fā)展 MySQL Server 所用的 Provider。(4) Npqsql,發(fā)展 Postgre

21、SQL 所用的 Provider。(5) OpenLink Software,發(fā)展支持多種數(shù)據(jù)庫所用的 Provider。(6) Phoenix Software International,發(fā)展支持 SQLite 數(shù)據(jù)庫的 Provider。(7) Sybase,將支持 Anywhere 數(shù)據(jù)庫。(8) VistaDB Software,將支持 VistaDB 數(shù)據(jù)庫。(9) DataDirect Technologies,發(fā)展支持多種數(shù)據(jù)庫所用的 Provider。(10) Firebird,支持 Firebird 數(shù)據(jù)庫。NoSql:MongoDb,RedisMemechacheEF學習

22、資源學習資料: 英文參考書我的BLOG: Web開發(fā)方式WebFrom 開發(fā) MVC 開發(fā)MVC是微軟2009對外公布的第一個開源的表示層框架,這是微軟的第一個開源項目MVC目的不是取代WebFrom開發(fā),只是web開發(fā)的另外一種選擇 Dynamic Data WebForms MVCPresentationRuntime Core 開發(fā)現(xiàn)狀WebForm模型MVC 模式簡介MVC 模式是一種表現(xiàn)模式。它將web應用程序分成三個主要組件即:視圖(View)控制器(Controller)模型(Model)M:Model 主要是存儲或者是處理數(shù)據(jù)的組件 Model其實是實現(xiàn)業(yè)務邏輯層對實體類相應

23、數(shù)據(jù)庫操作,如:CRUD(C:Create/R:Read/U:Update/D:Delete)。它包括數(shù)據(jù)、驗證規(guī)則、數(shù)據(jù)訪問和業(yè)務邏輯等應用程序信息。V:View 是用戶接口層組件。主要是將Model中的數(shù)據(jù)展示給用戶。ASPX和ASCX文件被用來處理視圖的職責。C: Controller 處理用戶交互,從model中獲取數(shù)據(jù)并將數(shù)據(jù)傳給指定的view控制器(Controller)- 負責轉(zhuǎn)發(fā)請求,對請求進行處理。視圖 (View) - 界面設計人員進行圖形界面設計。模型 (Model)-業(yè)務邏輯、數(shù)據(jù)、驗證規(guī)則、數(shù)據(jù)訪問等等圖解MVC模式 MVC請求模型借用WebFrom理解MVC新建We

24、bFrom項目Label的例子在page類中添加一個List在前臺用for循環(huán)遍歷顯示list分層思想WebFrom CodebehindMVC 代碼和頁面徹底分離 MVC 第一個程序新建一個MVC項目認識Web項目中的Controller認識Web項目中的View認識Web項目中的Model約定大于配置Controller放到controllers文件夾中,并且命名方式以XxController結(jié)尾每個Controller都對應View中的一個文件夾,文件夾的名稱跟Controller名相同Controller中的方法名都對應一個View(非必須,但是建議這么做)而且View的名字跟Acti

25、on的名字相同開發(fā)流程(轉(zhuǎn)變)新建Controller創(chuàng)建Action根據(jù)Action創(chuàng)建View在Action獲取數(shù)據(jù)并生產(chǎn)ActionResult傳遞給View。View是顯示數(shù)據(jù)的模板 url請求Controller.Action處理View響應 MVC請求處理流請求IISAspNet RuntimeControllerViewResponse請求都歸結(jié)到Action上,所以是Url驅(qū)動Action跟view是弱耦合View模板顯示頁面的規(guī)則:先找對于的Controller文件夾,再找對應的Shared文件夾所有的頁面繼承在viewpage類ViewData 傳遞數(shù)據(jù)載體Controll

26、erBase下的一個屬性ViewPage下的一個屬性在ViewResult的ExcuteResult方法時,Controller中的數(shù)據(jù)傳遞給ViewPage類表單演示實例講解 MVC的請求數(shù)據(jù)流演示純Html表單標簽Form的Action屬性:是直接指向Controller的Action獲取數(shù)據(jù)可以通過HttpContext的Request中獲取到:與=的區(qū)別練習 熟悉M、V、C 新建一個Mvc項目(項目名稱:MVCDemo)熟悉項目中文件的作用新建一個Controller 名字為CustomController,并添加index方法View中新建一個Custom文件夾,并創(chuàng)建index視圖

27、在創(chuàng)建的index方法中傳遞數(shù)據(jù)到view并顯示 MVC組件之間的關系 View和Controller都可以直接請求Model 但是Model不依賴View和controller Controller可以直接請求View來顯示具體頁面 View不依賴Controller 其實:View可以通過另外的方式來請求Controller深入講解Model包括數(shù)據(jù)、驗證規(guī)則、數(shù)據(jù)訪問和業(yè)務邏輯等應用程序信息它是我們Web應用的主框架Model調(diào)用的是我們的業(yè)務邏輯層Model作為ViewModel使用的情況再次強調(diào):Model是獨立的組件,它并不知道View的存在,更不知道Controller的存在。這

28、兩個分離的理解很重要!深入講解ModelModel包括數(shù)據(jù),對數(shù)據(jù)的操作與Model相關的設計方式 企業(yè)級項目的架構(gòu)方式實例(演示)Model的擴展:DomainModel、ViewModel的理解深入講解View注意:view是負責輸出顯示數(shù)據(jù),而非樣式View中的弱類型ViewData“”View中的強類型ViewData.ModelHtml.Encode=Html.Helper類Html.Helper擴展客戶端驗證MVC中智能提示怎么來的!數(shù)據(jù)CV容器之弱類型ViewData“”例如:Controller中代碼如下在前臺View中使用:傳遞方式:Controller.View()View

29、ContextView中的強類型ViewDataModel在Controller中代碼如下:在view前臺使用代碼如下:HtmlHelper簡介Helper:是為了方便View的開發(fā)而產(chǎn)生的HtmlHelper的演變普通調(diào)整首頁超級鏈接為:首頁當路由改變時候則需要修改例如:首頁如果項目里面有很多超級鏈接那需要改動很多地方根據(jù)路由改變也不受影響a href=首頁沒有智能感知,調(diào)試不方便則應運而生了:Html.Action(Home,Index)HtmlHelper之Action、表單標簽Html.Encode 相當于推薦大家使用,方便簡潔Html.Helper類支持強類型(1):Html.xxF

30、or實例在model中創(chuàng)建Techer類演示以弱類型方式將實體類展現(xiàn)到View演示以強類型方式將實體類展現(xiàn)到View強類型的實質(zhì):在aspx頁面的最上方加入的指令:% Page Language=C# Inherits=System.Web.Mvc.ViewPageIEnumerable %紅色部分就是ViewPage屬性:Model的具體類型,如果不指定具體的類型,則為dynamicHtml.Helper類強類型(2):Html.xx(“”)Html.Helper類DropDownListvar items = new List() (new SelectListItem() Text =

31、001, Value = 1, Selected = false), (new SelectListItem() Text = 002, Value = 2, Selected = false) ; 將items值給ViewData: ViewDataitems = items; 在aspx中這樣使用: 生成的代碼中,items將作為標簽的name和id值。 Html.Helper類CheckBox & RadioButton 在Controller獲取提交的值為(true,false)未操作 true選擇 false不選擇三種RadioButton第一個參數(shù)為控件名字(名字相同說明為同一個G

32、roup),返回值為第二個參數(shù)(紅色部分) Blue Purple Red Orange Yellow Brown GreenHtml.Helper類RenderPartial這個方法通過接受用戶控件的文件名以及相應的可變化的數(shù)據(jù)進行用戶控件的呈現(xiàn)可重用 用戶控件 顯示到具體的頁面中Html.Helper類RenderAction代碼實例:% Html.RenderAction( x = x.ControllerAction() ); %優(yōu)點 :讓控制器做它該做的事情:組織邏輯及與業(yè)務邏輯之間的通信。將實際使用的視圖/用戶控件抽象出來,便于未來的重構(gòu)。將控制器中的業(yè)務邏輯抽象出來,這也讓你的業(yè)

33、務邏輯可以專心做它該做的事。使用lambda表達式,強類型 Html.Helper類Form方式一: 方式二:Begin End HtmlHelper擴展方法擴展方法:1.方法所在的類必須是靜態(tài)的2.方法也必須是靜態(tài)的3.方法的第一個參數(shù)必須是你要擴展的那個類型,比如你要給int擴展一個方法,那么第一個參數(shù)就必須是int。4.在第一個參數(shù)前面還需要有一個this關鍵字。在MVC中擴展HtmlHelper后,要在使用擴展方法的頁面上引用擴展方法所在的名稱空間例如: MVC客戶端驗證要使用客戶端驗證,必須引入JS腳本支持MicrosoftAjax.jsMicrosoftMvcValidation.

34、js添加語句(MVC3中默認開啟).NET 框架中的 ponentModel.DataAnnotations命名空間包括了眾多可為你所用的內(nèi)置驗證特性,介紹用的最多的其中的四個:Required, StringLength, Range, 和 RegularExpression。定義自己的定制驗證特性,然后應用它們。你可以通過繼承自 ponentModel.DataAnnotations命名空間中 的ValidationAttribute基類,定義完全定制的特性。DataModel 驗證MetadataTypeAttribute Class為數(shù)據(jù)實體的partial class添加額外的元數(shù)據(jù)

35、驗證信息使用步驟:創(chuàng)建data-model partial class創(chuàng)建關聯(lián)的metadata class.將metadata class關聯(lián)到具體的數(shù)據(jù)實體類使用的注意事項標簽只能打到一個類上此標簽不能被繼承自動生成實體類的驗證將 額外的基于特性的元數(shù)據(jù)(象驗證特性)施加到由VS設計器自動生成/維護的類的一個方法是,采用一個我們稱之為“伙伴類(buddy classes)”的技術(shù)。基本上來說,你創(chuàng)建另外一個類,包含你的驗證特性和元數(shù)據(jù),然后通過將 “MetadataType”特性施加到一個與工具生成的類一起編譯的partial類上,將其與由設計器生成的類連接起來。例如,如果我們想要將我們前

36、 面用到的驗證規(guī)則施加到由LINQ to SQL 或 EF設計器維護的Person類上,我們可以更新我們的驗證代碼,使其存在于一個單獨的“Person_Validation”類上舉例應用public class ValidEmailAddressAttribute : RegularExpressionAttributeprivate const string EmailPattern = .+.+.+;public ValidEmailAddressAttribute() : base(EmailPattern)/ Default message unless declared on the

37、 attributeErrorMessage = 0 must be a valid email address.;This will work for server-side validation immediately, but what might surprise you is that it wontgive you client-side validation. This is because, although DataAnnotationsModelValidatorProvider canrun anything inherited from ValidationAttrib

38、ute on the server, it only knows how to generate clientsiderepresentations of the four specific subclasses listed in Table 129.DataAnnotationsModelValidatorProvider has a system of adapters, which are delegates that canconvert ValidationAttribute subclasses into ModelValidator instances. It has four

39、 built-in adapters: RangeAttributeAdapter RegularExpressionAttributeAdapter RequiredAttributeAdapter StringLengthAttributeAdapterThere are several possible ways of making DataAnnotationsModelValidatorProvider understandValidEmailAddressAttribute, the easiest of which is simply to associate EmailAddr

40、essAttribute withRegularExpressionAttributeAdapter. Add code similar to the following to Application_Start() inGlobal.asax.cs:protected void Application_Start()AreaRegistration.RegisterAllAreas();RegisterRoutes(RouteTable.Routes);DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ValidEmai

41、lAddressAttribute),typeof(RegularExpressionAttributeAdapter);AspNet MVC下的Ajax使用JQuery做相關的Ajax請求使用微軟提供的Ajax請求腳本JQuery Ajax跟普通的WebForm的開發(fā)方式都一致的Url地址不同點:請求的是Controller下的Action在使用Json返回JsonResult時注意要將第二個參數(shù)設置允許Get提交方式:return Json(,JsonRequestBehavior.AllowGet)在Ajax開發(fā)中要注意Ajax方法體內(nèi)的參數(shù)設置正確提交方式要跟Action打的標簽一致A

42、spnet MVC Microsoft Ajax將微軟提供的腳本引入到頁面中注意引用的順序Ajax.BeginForm沒有提供閉合的方法,請使用Using配合關閉AjaxOptions參數(shù)的設置SuccessMthod只是提供提醒,并沒有數(shù)據(jù)的傳遞AjaxOptions的參數(shù)Unobtrusive Ajax 應當將 JavaScript (或其它腳本)從 Html 中分離出來,就像最初將樣式從 Html 中分離出來一樣道理。簡單來說就是將嵌入在 Html 中的 JavaScript 全部取出來,放在單獨的 js 文件中,頁面中不要出現(xiàn)任何 onclick、onload 使用 Unobtrusi

43、ve Ajax 我們最大的收益就是簡單易于維護的代碼(Code is cleaner and easier to maintain)?;咎攸c網(wǎng)頁內(nèi)容和表單使用純 HTML;不借助 JavaScript,表單和超級連接也能正常使用;頁面外觀完全由 CSS 控制,而不是 HTML(不要用 table 來布局) 或 JavaScript;任何人都能通過任何設備(考慮不支持JavaScript的設備)訪問;Unobtrusive Ajax使用方式引用相應的Javascript文件【見備注】開啟 Unobtrusive JavaScriptWeb.Config文件中默認配置:代碼里啟用:HtmlHel

44、per.ClientValidationEnabled = true;HtmlHelper.UnobtrusiveJavaScriptEnabled = true;Ajax Option 對應AjaxOptionsHTML attributeConfirmdata-ajax-confirmHttpMethoddata-ajax-methodInsertionModedata-ajax-mode *LoadingElementDurationdata-ajax-loading-duration *LoadingElementIddata-ajax-loadingOnBegindata-ajax-

45、begin plete pleteOnFailuredata-ajax-failureOnSuccessdata-ajax-successUpdateTargetIddata-ajax-updateUrldata-ajax-urlAspNet MVC分頁自定義分頁首先定義一個接受分頁參數(shù)(page、pagesize)的Action查詢該頁的數(shù)據(jù)并返回前臺根據(jù)數(shù)據(jù)條數(shù)進行編寫頁碼超級鏈接實例見附注MvcContrib 開源地址: Html.Grid(Model)擴展方法介紹View中添加:練習練習Htmlhelper的控件的使用ActionLink 超級鏈接BeginForm form提交Che

46、ckBox 多選框DropDownList 下來列表框Hidden 隱藏域ListBox 列表Password 密碼框RadioButton 單選TextArea 文本域TextBox 文本框深入講解Routing在項目中我們引用了System.Web.Routing微軟將此項目單獨出來,并沒有開源代碼Routing的作用:確定Controller確定Action確定其他參數(shù)根據(jù)識別出來的數(shù)據(jù), 將請求傳遞給Controller和Action.深入講解RoutingMVC項目是URL請求驅(qū)動為什么訪問localhost/home/index會傳遞給 HomeController中名為index

47、的action(即HomeController類中的index方法)?怎么實現(xiàn)的呢?深入講解RoutingGlobal.asax.cs文件中定義了路由的識別規(guī)則 R outes.MapRoute( Default, / 路由名稱 controller/action/id, / 帶有參數(shù)的URL new controller = Home, action = Index, id = UrlParameter.Optional / 參數(shù)默認值 );我們的Url: localhost/home/indexlocalhost是域名, 所以首先要去掉域名部分: home/index對應了上面代碼中的這種

48、URL結(jié)構(gòu): controller/action/id因為我們建立了這種Url結(jié)構(gòu)的識別規(guī)則, 所以能夠識別出 Controller是home, action是index, id沒有則為默認值.MapRoute()方法以下方法的重載MapRoute( string name, string url); MapRoute( string name, string url, object defaults); MapRoute( string name, string url, string namespaces); MapRoute( string name, string url, objec

49、t defaults, object constraints); MapRoute( string name, string url, object defaults, string namespaces); MapRoute( string name, string url, object defaults, object constraints, string namespaces);MapRout參數(shù)介紹name參數(shù): 規(guī)則名稱, 可以隨意起名.不可以重名,否則會發(fā)生錯誤: 路由集合中已經(jīng)存在名為“Default”的路由。路由名必須是唯一的。url參數(shù): url獲取數(shù)據(jù)的規(guī)則, 這里不是

50、正則表達式, 將要識別的參數(shù)括起來即可, 比如: controller/action最少只需要傳遞name和url參數(shù)就可以建立一條Routing(路由)規(guī)則.比如實例中的規(guī)則完全可以改為:routes.MapRoute( Default, controller/action);MapRout參數(shù)介紹defaults參數(shù): url參數(shù)的默認值.如果一個url只有controller: localhost/home/ 而且我們只建立了一條url獲取數(shù)據(jù)規(guī)則: controller/action那么這時就會為action參數(shù)設置defaults參數(shù)中規(guī)定的默認值. defaults參數(shù)是Objec

51、t類型,所以可以傳遞一個匿名類型來初始化默認值:new controller = Home, action = Index 實例中使用的是三個參數(shù)的MapRoute方法:routes.MapRoute( Default, / Route name controller/action/id, / URL with parameters new controller = Home, action = Index, id = / Parameter defaults );MapRout參數(shù)介紹constraints參數(shù): 用來限定每個參數(shù)的規(guī)則或Http請求的類型.constraints屬性是一個R

52、outeValueDictionary對象,也就是一個字典表, 但是這個字典表的值可以有兩種:用于定義正則表達式的字符串。正則表達式不區(qū)分大小寫。 一個用于實現(xiàn) IRouteConstraint 接口且包含 Match 方法的對象。 通過使用正則表達式可以規(guī)定參數(shù)格式,比如controller參數(shù)只能為4位數(shù)字:new controller = d4MapRout參數(shù)介紹通過第IRouteConstraint 接口目前可以限制請求的類型.因為System.Web.Routing中提供了HttpMethodConstraint類, 這個類實現(xiàn)了IRouteConstraint 接口. 我們可以通

53、過為RouteValueDictionary字典對象添加鍵為httpMethod, 值為一個HttpMethodConstraint對象來為路由規(guī)則添加HTTP 謂詞的限制, 比如限制一條路由規(guī)則只能處理GET請求:httpMethod = new HttpMethodConstraint( GET, POST )完整的代碼如下:routes.MapRoute( Default, / Route name controller/action/id, / URL with parameters new controller = Home, action = Index, id = , / Par

54、ameter defaults new controller = d4 , httpMethod = new HttpMethodConstraint( GET, POST ) );Url路由實例講解對于一個網(wǎng)站,為了SEO友好,一個網(wǎng)址的URL層次不要超過三層:localhost/頻道/具體網(wǎng)頁其中域名第一層, 頻道第二層, 那么最后的網(wǎng)頁就只剩下最后一層了. 如果使用默認實例中的“controller/action-其他參數(shù)的形式會影響網(wǎng)站的SEO.Url路由實例講解#region 酒店頻道部分 / hotels/list-beijing-100,200-3 routes.MapRoute

55、( 酒店列表頁, hotels/action-city-price-star, new controller = Hotel, action = list, city = beijing, price=-1,-1, star=-1 , new city=a-zA-Z*,price=(d)+,(d)+, star=-1-5 ); /hotels/所有匹配 routes.MapRoute( 酒店首頁, hotels/*values, new controller = Hotel, action = default, hotelid = ); #endregion /網(wǎng)站首頁. routes.Map

56、Route( 網(wǎng)站首頁, *values, new controller = Home, action = index ); Url實例總結(jié)實現(xiàn)的功能:(1)訪問 localhost/hotels/list-beijing-100,200-3 會訪問酒店頻道的列表頁,并傳入查詢參數(shù)(2)訪問 localhost/hotels 下面的任何其他頁面地址, 都會跳轉(zhuǎn)到酒店首頁. (3)訪問 localhost 下面的任何地址, 如果未匹配上面2條, 則跳轉(zhuǎn)到首頁.簡單總結(jié):(1)Routing規(guī)則有順序(按照添加是的順序), 如果一個url匹配了多個Routing規(guī)則, 則按照第一個匹配的Routi

57、ng規(guī)則執(zhí)行.(2)由于上面的規(guī)則, 要將具體頻道的具體頁面放在最上方, 將頻道首頁 和 網(wǎng)站首頁 放在最下方.(3) *values 表示后面可以使任意的格式. MVC Areas介紹隨著業(yè)務的需要,結(jié)構(gòu)需求會越來越多,views目錄下面的文件夾越來越多,更或者你需要更細結(jié)構(gòu)的頁面路徑,另外可能是多個人合作開發(fā),有多個Web項目需要進行合并在一個網(wǎng)站中訪問用Areas解決上述問題實例關于測試Routing使用RouteDebug輔助類在Global.asax添加如下代碼:protected void Application_Start() RegisterRoutes(RouteTable.

58、Routes); RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes); Mvc請求歷程一個請求過來首先被view捕獲,然后傳遞給routing,routing根據(jù)用戶的請求解析調(diào)用具體的Controller的action。然后Controller返回一個viewresult給ViewEngine然后寫到Response中練習 在上一個練習的基礎上添加幾條路由規(guī)則 要求: 定義規(guī)則能匹配如下的url: (1) 注:flydragon是博主名字后面是日期,并由正則表達式進行驗證,Blogs為Controller,查

59、看博客頁面的Action是Show(string autor,DateTime datetime) (2) Url對應的Action需要傳遞兩個參數(shù) (3)定義一個匹配所有的url的規(guī)則 (4)自己定義一個常用的url規(guī)則,并練習使用正則表達式*練習使用RouteDebug測試自己的路由規(guī)則深入講解Controller職責 Controller負責將獲取Model數(shù)據(jù)并將Model傳遞給View對象.通知View對象顯示.一個Controller可以包含多個Action. 每一個Action都是一個方法, 返回一個ActionResult實例一個Controller對應一個XxControll

60、er.cs控制文件,對應在View中有一個Xx文件夾。一般情況一個Action對應一個aspx頁面深入講解Controller在 MVC中, 一個Controller可以包含多個Action. 每一個Action都是一個方法, 返回一個ActionResult實例. ActionResult類包括ExecuteResult方法, 當ActionResult對象返回后會執(zhí)行此方法. 下面分層次的總結(jié)Controller 處理流程:1. 頁面處理流程發(fā)送請求 UrlRoutingModule捕獲請求 MvcRouteHandler.GetHttpHandler() MvcHandler.Proce

溫馨提示

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

評論

0/150

提交評論