版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
ASP.NETMVC實訓(xùn)教程機械工業(yè)出版社趙魯濤李曄等編目錄模型層概述與執(zhí)行機制實體數(shù)據(jù)模型2.12.22.3LINQ語句與使用2.4模型的數(shù)據(jù)校驗第二章模型第二章模型2.1模型層概述與執(zhí)行機制模型(Model)層是MVC4框架的最底層部分,它的職能主要有兩個:①提供數(shù)據(jù)庫的支持,包括對數(shù)據(jù)庫中的數(shù)據(jù)進行增加(insert)、刪除(delete)、修改(update)和查找(select)等具體操作;②提供軟件模型、應(yīng)用的具體實現(xiàn)過程,也就是最底層的方法的具體內(nèi)容,封裝給上層接口進行調(diào)用。在MVC框架中,模型層的執(zhí)行機制如圖2.1所示。圖2.1模型層在MVC框架中的執(zhí)行機制第二章模型2.1模型層概述與執(zhí)行機制ASP.NET的MVC4框架中,模型表示應(yīng)用程序的數(shù)據(jù)對象,以及相應(yīng)的業(yè)務(wù)領(lǐng)域邏輯,包括數(shù)據(jù)驗證和業(yè)務(wù)規(guī)則等內(nèi)容。因此,模型是ASP.NETMVC4框架的核心部分。由于模型層應(yīng)該只和數(shù)據(jù)及業(yè)務(wù)邏輯有關(guān),也就是說,其不應(yīng)該負(fù)責(zé)處理所有與數(shù)據(jù)或業(yè)務(wù)處理無關(guān)的操作,如不應(yīng)該控制網(wǎng)站的執(zhí)行流程等,因此,模型層應(yīng)該只專注于如何有效地提供數(shù)據(jù)訪問機制、交互環(huán)境、數(shù)據(jù)格式驗證、業(yè)務(wù)邏輯驗證等服務(wù)。同時,由于模型的獨立性非常高,因此,如果一個VisualStudio方案中有多個要開發(fā)的項目,應(yīng)該將模型獨立成一個項目,好讓此模型項目能在不同的項目之間共享使用。第二章模型2.2實體數(shù)據(jù)模型MVC4中,實體數(shù)據(jù)類型是系統(tǒng)與數(shù)據(jù)庫的交互接口,非常重要。不同于Java使用JDBC-ODBC的數(shù)據(jù)庫連接方式,MVC4在數(shù)據(jù)庫連接的基礎(chǔ)之上,將數(shù)據(jù)庫在系統(tǒng)中抽象成為一個具體的數(shù)據(jù)庫實體對象,在實體對象中映射出數(shù)據(jù)庫中的各個表、各個字段的具體內(nèi)容,完全模擬數(shù)據(jù)庫。也就是說,在編寫的工程中,直接在系統(tǒng)中就可以查到各個數(shù)據(jù)表的組成、樣式和取值等,不用再去數(shù)據(jù)庫中進行查找。建立數(shù)據(jù)庫實體的方法如例2.1所示。【例2.1】數(shù)據(jù)庫實體的建立。本例是對數(shù)據(jù)庫實體建立步驟的具體說明。通過本例,讀者可以完全掌握實體數(shù)據(jù)庫建立的方法與機制。首先,數(shù)據(jù)庫名稱為MyStudent,數(shù)據(jù)庫具體結(jié)構(gòu)見表2.1~表2.3。序號字段字段描述格式長度是否主碼備注1Sno學(xué)號nVarchar5是
2Sname姓名nVarchar8
3Ssex性別nVarchar2
4Sage年齡Numeric
5Sdept所在系所nVarchar20
表2.1
Student(學(xué)生)表第二章模型2.2實體數(shù)據(jù)模型表2.3SC(選課)表序號字段字段描述格式長度是否主碼備注1Cno課程號nVarchar5是
2Cname課程名稱nVarchar20
3Cpno先行課號nVarchar5
外碼4Ccredit學(xué)分Numeric
表2.2Couarse(課程)表序號字段字段描述格式長度是否主碼備注1Sno學(xué)號nVarchar5
2Cno課程號nVarchar5
3Grade成績Numeric
第二章模型2.2實體數(shù)據(jù)模型表2.4Student表初始值數(shù)據(jù)庫的初始賦值見表2.4~表2.6。SnoSnameSsexSageSdept95001李名男20CS95002張明女19IS95003劉紅女19MA95004陳列男19ISCnoCnameCpnoCcredit1數(shù)據(jù)庫542數(shù)學(xué)
23信息系統(tǒng)144操作系統(tǒng)635數(shù)據(jù)結(jié)構(gòu)746數(shù)據(jù)處理
27PASCAL語言64表2.5Course表初始值第二章模型2.2實體數(shù)據(jù)模型表2.6SC表初始值SnoCnoGrade9500119795001290950013809500228695002392具體數(shù)據(jù)實體的建立過程見1.4.2節(jié)Step01~Step05。建立好的數(shù)據(jù)庫實體如圖2.2所示。圖2.2
MyStudent數(shù)據(jù)庫實體圖第二章模型2.2實體數(shù)據(jù)模型需要注意的是,在Step05中勾選“確定所生成對象名稱的單復(fù)數(shù)形式”復(fù)選框后,系統(tǒng)會將每個表以一個集合的復(fù)數(shù)形式給出,而每一個個體元素則以一個單一個體(單數(shù))形式給出。也就是說,在創(chuàng)建實體數(shù)據(jù)類型時,實體數(shù)據(jù)類型是有單復(fù)數(shù)之分的,數(shù)據(jù)庫和表的類型使用復(fù)數(shù),實例使用單數(shù),因此需要注意有無s的區(qū)分。在數(shù)據(jù)實體中,右擊實體表,在彈出的快捷菜單中選擇“屬性”,會在UI界面的右下方顯示數(shù)據(jù)表的屬性。通過屬性,可以進行表名稱、表對應(yīng)集的修改,單擊每一個表內(nèi)容,如Student表的Sno屬性,會在右下角顯示Sno屬性的相關(guān)屬性。我們可以在這里進行表與屬性的修改?!纠?.2】對表字段進行操作。1)選擇“Student”表,將表名稱改為“PersonInSchool”,對應(yīng)于數(shù)據(jù)庫中的“Student”表。2)選擇“Student”表中的“Sname”字段,修改其最大長度為6,名稱為“StudentName”,對應(yīng)于數(shù)據(jù)庫中的“Sname”屬性,默認(rèn)值設(shè)為“省略”;設(shè)置“Sage”的名稱為“StudentAge”,對應(yīng)于數(shù)據(jù)庫中的“Sage”屬性,設(shè)置默認(rèn)值為“18”。3)針對以上要求,在1.4.2節(jié)的例子中進行修改,完成以上內(nèi)容,并保證系統(tǒng)的正確運行。以上內(nèi)容均在右側(cè)屬性欄中進行修改即可。需要注意的是,當(dāng)完成以上修改后,程序中之前應(yīng)用的字段都要進行相應(yīng)的對照修改,這樣才能保證系統(tǒng)的正常運行。第二章模型2.3LINQ語句與使用在MVC4的數(shù)據(jù)部分,我們將不再使用普通的SQL語句作為數(shù)據(jù)庫操作語言,而是使用語言集成查詢(LanguageIntegratedQuery,LINQ)作為固定數(shù)據(jù)庫的操作語言。LINQ是ASP.NET中的新特性,它分為LINQtoObject、LINQtoSQL、LINQtoXML、LINQtoDataSet,并且它提供了統(tǒng)一的語法來查詢多種異構(gòu)數(shù)據(jù)源,開發(fā)人員可使用任何.NET語言(比如C#或者VB.NET)來查詢數(shù)據(jù)源中的數(shù)據(jù),而不用處理各種異構(gòu)數(shù)據(jù)源之間的差異。LINQ允許開發(fā)人員查詢?nèi)魏螌崿F(xiàn)了IEnumerable<>接口的集合,如Array、List、XML、DOM或者SQLServer數(shù)據(jù)表。LINQ提供了翻譯時的類型安全檢查和動態(tài)類型組合等功能,這里重點講解如何使用LINQtoSQL訪問數(shù)據(jù)庫。第二章模型2.3LINQ語句與使用LINQ與SQL相比,有不少的好處,特別是學(xué)過SQL的人員更容易上手。LINQ的優(yōu)點主要表現(xiàn)在:1)無須復(fù)雜的學(xué)習(xí)過程即可上手。2)編寫更少代碼即可創(chuàng)建完整的應(yīng)用。3)更快開發(fā)錯誤更少的應(yīng)用。4)無須利用“奇怪”的編程技巧就可合并數(shù)據(jù)源。5)提高新開發(fā)者的開發(fā)效率。6)任何對象或數(shù)據(jù)源都可以定制實現(xiàn)LINQ適配器,為數(shù)據(jù)交互帶來真正的便利。2.3.1使用LINQ的好處第二章模型2.3LINQ語句與使用1.DataContext類型介紹DataContext類型(數(shù)據(jù)上下文)是System.Data.Linq命名空間下的重要類型,用于把查詢語句翻譯成SQL語句,以及把數(shù)據(jù)從數(shù)據(jù)庫返回給調(diào)用方和把實體的修改寫入數(shù)據(jù)庫。DataContext提供了以下一些實用的功能:1)以日志形式記錄DataContext生成的SQL。2)執(zhí)行SQL(包括查詢和更新語句)。3)創(chuàng)建和刪除數(shù)據(jù)庫。DataContext是實體和數(shù)據(jù)庫之間的橋梁,首先我們需要定義映射到數(shù)據(jù)表的實體。Step01:定義實體類。2.3.2LINQtoSQL的預(yù)備知識第二章模型2.3LINQ語句與使用以MyStudent數(shù)據(jù)庫為例,上述Student類被映射成一個表,對應(yīng)數(shù)據(jù)庫中的Student表。然后,在類型中定義了4個屬性,對應(yīng)表中的4個字段。其中,Sname字段是主碼,如果沒有指定Column特性的Name屬性,那么系統(tǒng)會把屬性名作為數(shù)據(jù)表的字段名,也就是說,實體類的屬性名就需要和數(shù)據(jù)表中的字段名一致。Step02:現(xiàn)在,創(chuàng)建一個ASP.NET頁面,然后在頁面上加入一個GridView控件數(shù)據(jù)綁定。Step03:使用DataContext類型把實體類和數(shù)據(jù)庫中的數(shù)據(jù)進行關(guān)聯(lián)。用戶可以直接在DataContext構(gòu)造方法中定義連接字符串,也可以使用IDbConnection。usingSystem.Data.SqlClient;IDbConnectionconn=newSqlConnection("server=xxx;database=Northwind;uid=xxx;pwd=xxx");DataContextctx=newDataContext(conn);Step04:然后,通過GetTable獲取表示底層數(shù)據(jù)表的Table類型,顯然,數(shù)據(jù)庫中的Student表的實體是Student類型。隨后的查詢語句,即使用戶不懂SQL應(yīng)該也能看明白。從Student表中找出Sname以“李”開頭的記錄,并把Sname、Ssex、Sage及Sdept封裝成新的匿名類型進行返回。2.3.2LINQtoSQL的預(yù)備知識第二章模型2.3LINQ語句與使用結(jié)果如圖2.3所示。2.3.2LINQtoSQL的預(yù)備知識圖2.3運行結(jié)果2.匿名類型在動態(tài)語言中,用戶可能比較熟悉的概念是匿名類型(anonymoustype)。當(dāng)需要創(chuàng)建臨時類型,卻并不想創(chuàng)建類時,可以使用匿名類型。下面的代碼演示了如何在C#中創(chuàng)建匿名類型。varstudent=new{FirstName="Stephen",LastName="Walt"};注意:student變量并沒有指定類型(JavaScript或VBScript與之非常類似)。盡管如此,student仍然具有它的類型,只是用戶不知道它的名字而已,它是匿名的,理解這一點非常重要。僅僅一行代碼,我們即創(chuàng)建了一個新的類,又初始化了它的屬性,十分簡潔。在使用LINQtoSQL時,匿名類型非常有用,因為用戶會發(fā)現(xiàn)經(jīng)常需要創(chuàng)建一些臨時功能的新類型。例如,當(dāng)執(zhí)行一個查詢時,也許希望返回一個類,用來代表一些數(shù)據(jù)庫列的集合,此時將需要創(chuàng)建一個代表這些列的臨時類。第二章模型2.3LINQ語句與使用2.3.2LINQtoSQL的預(yù)備知識3.Lambda表達(dá)式在上述這段代碼中,添加了C#4.0的新語法:s=>(s.IndexOf("a")>-1),這就是一個Lambda表達(dá)式,現(xiàn)在只需要簡單的一些字符就完成了原本需要單獨創(chuàng)建一個方法的過程,而且語法相當(dāng)簡潔。通過上面的例子,我們現(xiàn)在對Lambda表達(dá)式已經(jīng)有了一個基本的了解。一個Lambda表達(dá)式通常由如下部分組成。1)首先是一個參數(shù)或者參數(shù)列表,也就是輸入變量。在上述示例中,由于需要為委托傳遞一個字符串類型的變量,因此左側(cè)的是s變量。2)接著是=>符號,稱為Lambda運算符,MSDN中將這個符號讀作“goesto”。3)最后是Lambda語句(塊),可以是單條語句也可以是多個語句的語句塊。為了加深印象,讀者可以這樣來理解Lambda表達(dá)式:要處理的參數(shù)=>處理這些參數(shù)的語句(塊)說明如下:①要處理的參數(shù):可以有一個參數(shù)、多個參數(shù),或者無參數(shù)。②處理這些參數(shù)的語句(塊):這部分就是我們平時編寫函數(shù)時的實現(xiàn)部分(函數(shù)體)。第二章模型2.3LINQ語句與使用2.3.3LINQtoSQL的查詢使用LINQtoSQL進行查詢,類似于創(chuàng)建一個反向的SQL查詢。LINQtoSQL查詢以一個from子句開始,它指定了數(shù)據(jù)的位置,然后,指定where子句過濾數(shù)據(jù),最后,指定用來表示數(shù)據(jù)的select子句(決定要返回的對象和屬性)。因此,下列查詢:將被C#編譯器翻譯成下面的查詢:varq=db.Customers.Where(c=>c.City=="London").Select(c=>c);第一個查詢使用了查詢語法,第二個查詢使用了方法語法。這兩種查詢是相同的。注意:使用方法語法的查詢在Where()和Select()方法中允許使用Lambda表達(dá)式。Where()方法中的Lambda表達(dá)式用來過濾數(shù)據(jù),Select()方法指明要返回的對象合適屬性。第二章模型2.3LINQ語句與使用2.3.3LINQtoSQL的查詢1.簡單查詢【例2.3】篩選年齡為20的學(xué)生。2.條件查詢【例2.4】使用SELECT和條件語句返回學(xué)生姓名和所在系所的序列,其中系所只能是CS。第二章模型2.3LINQ語句與使用2.3.3LINQtoSQL的查詢【例2.5】使用嵌套查詢返回所有選課人的學(xué)號、姓名、課程號、課程名稱、先行課號、學(xué)分和成績?!纠?.6】使用Count/Sum/Min/Max/Avg操作符進行查詢。1)查找最小年齡。varq=db.Studnets.Select(p=>p.Sage).Min();2)查找擁有最低學(xué)分的課程。varq=db.Course.Min(o=>o.Ccredit);第二章模型2.3LINQ語句與使用2.3.3LINQtoSQL的查詢【例2.7】使用OrderBy按課程學(xué)分對課程進行排序?!纠?.8】使用GroupBy進行查詢。使用OrderBy、Max和GroupBy得到每個學(xué)生的最高成績,并按Sno對其進行排序。第二章模型2.3LINQ語句與使用2.3.3LINQtoSQL的查詢3.模糊查詢使用LINQtoSQL進行模糊查詢,可以有很多方法,如Length、Substring、Contain、StartsWith、IndexOf等?!纠?.9】下面查詢并返回以“李”開頭的全部學(xué)生信息。MyStudentsContextdb=newMyStudentsDataContext();varq=db.Students.where(m=>m.Sname.StartsWith("李"))4.多表查詢【例2.10】在select子句中使用外碼來篩選成學(xué)生和成績。像上程序2、3行所示,語句沒有join和into,則被翻譯成SelectMany;同時有join和in時,那么語句就被翻譯為GroupJoin。在這里,in的概念是對其結(jié)果進行重新命名。第二章模型2.3LINQ語句與使用2.3.3LINQtoSQL的查詢【例2.11】顯式聯(lián)接兩個表并從這兩個表投影出結(jié)果?!纠?.12】顯式聯(lián)接三個表并分別從每個表投影出結(jié)果。第二章模型2.3LINQ語句與使用2.3.3LINQtoSQL的查詢【例2.13】以Students作為主表,SCs作為要連接的表,當(dāng)SCs表中內(nèi)容為空時,用null值填充。join的結(jié)果重命名為ords,使用DefaultIfEmpty()函數(shù)對其再次查詢。其最后的結(jié)果中有個Order,因為“fromoinords.DefaultIfEmpty()”是對ords組再一次遍歷,所以,最后結(jié)果中的Order并不是一個集合。但是,如果沒有“fromoinords.DefaultIfEmpty()”這條語句,而且最后的select語句寫成“selectnew{e.Sname,Order=ords}”的話,那么Order就是一個集合。第二章模型2.3LINQ語句與使用2.3.4LINQtoSQL進行插入插入記錄時需要先創(chuàng)建一條新記錄(對象),包括數(shù)據(jù)表中不能為null的所有字段,然后將這個對象作為屬性成員添加到原有的類中,最后增加到數(shù)據(jù)庫中。使用LINQtoSQL添加或插入新記錄也是這樣的步驟。首先,需要使用InsertOnSubmit()方法將一個實體添加到一個已經(jīng)存在的表中。然后,調(diào)用DataContext中的SubmitChanges()對數(shù)據(jù)庫執(zhí)行SQLINSERT語句。實例代碼:第二章模型2.3LINQ語句與使用2.3.5LINQtoSQL進行更新使用LINQtoSQL進行更新時,可以通過修改實體屬性并調(diào)用DataContext的SubmitChanges()方法來對LINQtoSQL實體和底層的數(shù)據(jù)庫表進行更新。實例代碼:總結(jié)一下,這段代碼就是先得到產(chǎn)品ID=12的產(chǎn)品,然后修改產(chǎn)品的單價屬性,最后調(diào)用SubmitChanges()方法向數(shù)據(jù)庫提交修改。第二章模型2.3LINQ語句與使用2.3.6LINQtoSQL進行刪除使用LINQtoSQL進行刪除時,可以采用下面的代碼。實例代碼:該段代碼一開始從Student數(shù)據(jù)表中獲取m.Sno==int.Parse(TextBox8.Text)的記錄,然后用DeleteOnSubmit()的方法將該條記錄刪除,最后調(diào)用SubmitChanges()方法向數(shù)據(jù)庫提交修改。第二章模型2.4模型的數(shù)據(jù)校驗對用戶輸入的驗證以及強制業(yè)務(wù)規(guī)則/邏輯是大多數(shù)Web應(yīng)用的核心需求。ASP.NETMVC4包含了許多新的特性,明顯簡化了對用戶輸入的驗證以及在模型/視圖模型中對驗證邏輯的強行實施。這些特性是這樣設(shè)計的,驗證邏輯在服務(wù)器上執(zhí)行,也可以選擇在客戶端通過JavaScript來執(zhí)行。ASP.NETMVC4中的驗證設(shè)施和特性這樣設(shè)計,以便:1)開發(fā)人員可以輕松地利用內(nèi)置于.NET框架中的DataAnnotation驗證支持。DataAnnotation提供了一個非常簡便的方式,可以使用最少的代碼在對象和屬性上用聲明的方式添加驗證規(guī)則。2)開發(fā)人員可以集成他們自己的驗證引擎,或者利用現(xiàn)有的驗證框架,如Castle驗證器或EntLib驗證庫。ASP.NETMVC4的驗證特性是設(shè)計用來在利用新的ASP.NETMVC4的驗證設(shè)施(包括客戶端驗證、模型綁定驗證等)的同時,簡化任何類型的驗證架構(gòu)的插入的。這意味著在常見的應(yīng)用場景中啟用驗證是極其容易的,同時對更高級的場景還能保持極高的靈活性。第二章模型2.4模型的數(shù)據(jù)校驗下面在ASP.NETMVC4中全程演示一個簡單的CRUD場景示例,利用新的內(nèi)置DataAnnotation驗證支持。具體來說,就是實現(xiàn)一個“Create”表單來允許用戶輸入個人數(shù)據(jù)。我們想要確保在輸入數(shù)據(jù)保存到數(shù)據(jù)庫之前是合法的,如果不合法,就顯示合適的錯誤消息。我們想要使得這個驗證同時在服務(wù)器端和客戶端(通過JavaScript)發(fā)生。我們還想要確保我們的代碼遵循DRY原則(Don'tRepeatYourself,即不重復(fù)自己),這意味著我們應(yīng)該只在一處實施驗證規(guī)則,然后使得我們的控制器、action方法和視圖來“兌現(xiàn)”這個承諾。接下來將使用VisualStudio2012,并利用ASP.NETMVC4來實現(xiàn)上述的場景。用戶也可以使用VisualStudio2010及ASP.NETMVC4來實現(xiàn)完全一樣的場景。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗Step01:實現(xiàn)FriendsController(沒有校驗)。首先在一個新的ASP.NETMVC4項目中添加一個簡單的“Person”類,像下面這樣:2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證然后在項目中添加一個“FriendsController”控制器類,添加兩個“Create”action方法。第一個action方法是在對/Friends/CreateURL的HTTP-GET請求進來時調(diào)用的,它會顯示一個空白的表單,用來輸入個人數(shù)據(jù);第二個action方法是在對/Friends/CreateURL的HTTP-POST請求進來時調(diào)用的,它會將提交的表單輸入映射到一個Person對象,確認(rèn)沒有綁定錯誤發(fā)生,如果是合法的,最終會將數(shù)據(jù)保存到數(shù)據(jù)庫中(在下文我們會實現(xiàn)相關(guān)的數(shù)據(jù)庫工作)。如果提交的表單輸入是不合法的,那么該action方法會重新顯示帶有錯誤的表單。第二章模型2.4模型的數(shù)據(jù)校驗2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗在實現(xiàn)了控制器之后,可以在VisualStudio中的其中一個action方法中右擊,在彈出的快捷菜單中選擇“添加視圖”命令,這會彈出“添加視圖”對話框,選擇自動生成傳入對象為Person的“Create”視圖,如圖2.4所示。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證圖2.4構(gòu)建視圖第二章模型2.4模型的數(shù)據(jù)校驗然后,VisualStudio會在我們項目的\Views\Friends\目錄中生成一個含有框架代碼的Create.aspx視圖文件。注意右邊這段代碼,它利用了ASP.NETMVC4中新的強類型HTML輔助方法。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗此時,當(dāng)我們運行該應(yīng)用,并且訪問/Friends/CreateURL時,將得到一個可以輸入數(shù)據(jù)的空白表單,如圖2.5所示。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證圖2.5Create.aspx視圖但是,由于我們還沒有在應(yīng)用中實現(xiàn)任何驗證,因此無法阻止用戶在表單中輸入不合法的內(nèi)容,然后將其提交到服務(wù)器中。第二章模型2.4模型的數(shù)據(jù)校驗Step02:使用DataAnnotation來啟用驗證?,F(xiàn)在,讓我們來更新應(yīng)用,執(zhí)行一些基本的輸入驗證規(guī)則。我們將在Person模型對象上實現(xiàn)這些規(guī)則,而不是在控制器或視圖中實現(xiàn)。在Person對象上實現(xiàn)這些規(guī)則的好處:這將確保這些驗證在應(yīng)用中任何使用Person對象的場景中都會執(zhí)行(假如后來添加了編輯場景的話),從而避免在多處重復(fù)這些規(guī)則。ASP.NETMVC4允許開發(fā)人員輕松地在模型或視圖模型類上添加聲明式驗證,然后ASP.NETMVC在應(yīng)用中實施模型綁定操作時,這些驗證規(guī)則就會自動執(zhí)行。舉例來說,讓我們更新Person類,在其中添加幾個驗證特性,這樣做的話,將在文件的頂部添加一條對“System.ComponentModel.DataAnnotations”命名空間的“using”語句,然后在Person的屬性上使用[Required]、[StringLength]、[Range]和[RegularExpression]驗證特性(這幾個特性都是在那個命名空間中實現(xiàn)的)。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗既然添加了驗證特性到Person類,那么現(xiàn)在來重新運行我們的應(yīng)用,此時需要查看在輸入不合法輸入項并將其提交回服務(wù)器時會發(fā)生什么,如圖2.6所示。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證圖2.6驗證效果第二章模型2.4模型的數(shù)據(jù)校驗從圖2.6我們可以看出,此例是一個不錯的校驗體驗,帶不合法輸入的文本元素以紅色高亮顯示,我們指定的驗證錯誤消息也顯示給了用戶。另外,表單還保留用戶原先輸入的數(shù)據(jù),這樣他們不用重新填寫什么。上述內(nèi)容究竟如何實現(xiàn)呢?要理解這個行為,讓我們看一下處理表單的POST場景的Createaction方法。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗在我們的HTML表單提交回服務(wù)器時,上面的方法就會被調(diào)用。因為該action方法接收一個“Person”對象為參數(shù),所以ASP.NETMVC會創(chuàng)建一個Person對象,自動將傳輸進來的表單輸入數(shù)值映射到該對象上。作為該過程的一部分,ASP.NETMVC還會檢查該Person對象上的DataAnnotation驗證特性是否合法。如果一切都合法,那么我們代碼中的ModelState.IsValid檢查就會返回“true”,在這種情形下,我們(最終)將把該Person對象保存到數(shù)據(jù)庫中,然后重定向到主頁。如果Person對象上有任何驗證錯誤,那么action方法就會以該不合法Person對象的數(shù)據(jù)重新顯示表單,這是通過上面代碼片段中最后一條代碼語句實現(xiàn)的。然后,錯誤消息就會顯示在我們的視圖中,因為Create表單在每一個<%:Html.TextBoxFor()%>輔助方法的調(diào)用旁都有一個<%:Html.ValidationMessageFor()%>輔助方法調(diào)用。Html.ValidationMessageFor()輔助方法會針對傳入視圖的任何不合法的模型屬性輸出合適的錯誤消息。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗這個模式/方式有一個好處,就是非常容易配置。另外,它還允許我們輕松地添加或改變Person類上的驗證規(guī)則,而不必改變控制器或視圖中的任何代碼。這個在一個地方指定驗證規(guī)則,然后在所有的地方都會被承諾和遵守的能力,允許我們以最小的努力快速地發(fā)展我們的應(yīng)用和規(guī)則。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗Step03:啟用客戶端驗證。目前我們的應(yīng)用只能做服務(wù)器端的驗證,這意味著我們的終端用戶需要將表單提交到服務(wù)器才能看到任何驗證錯誤消息。ASP.NETMVC4的驗證架構(gòu)中有一個非常不錯的功能,那就是它同時支持服務(wù)器端和客戶端驗證。如果要啟用這個功能,那么我們要做的就是在視圖中添加兩個JavaScript引用,即編寫下面的代碼。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證在添加了上述代碼語句后,ASP.NETMVC4就會使用我們添加到Person類上的驗證元數(shù)據(jù),為我們連接好客戶端JavaScript驗證邏輯。這意味著,當(dāng)用戶使用<Tab>鍵跳出一個不合法的輸入元素時,就會得到瞬時的驗證錯誤,如圖2.7(見下頁)所示。第二章模型2.4模型的數(shù)據(jù)校驗讓我們重新運行應(yīng)用,在“FirstName”、“LastName”和“Email”文本框中輸入合法的數(shù)值,然后嘗試單擊“Create”按鈕,發(fā)現(xiàn)會有錯誤提示,如圖2.8所示。注意,其實我們不必訪問服務(wù)器就會得到超出年齡范圍值的瞬時錯誤消息。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證圖2.7瞬時的驗證錯誤圖2.8提交后的驗證錯誤第二章模型2.4模型的數(shù)據(jù)校驗這項技術(shù)帶來的好處是,我們不必編寫自己的任何JavaScript就能啟用上面的驗證邏輯。我們可以在一個地方指定規(guī)則,然后在整個應(yīng)用中得到執(zhí)行,即同時在客戶端和服務(wù)器端。值得讀者注意的是,由于安全的原因,服務(wù)器端驗證規(guī)則總是執(zhí)行的,即使用戶啟用了客戶端支持。這是為了避免黑客嘗試?yán)@過客戶端規(guī)則,“哄騙”攻擊(spoof)用戶的服務(wù)器。ASP.NETMVC4中的客戶端JavaScript驗證支持可與用戶在ASP.NETMVC應(yīng)用中使用的任何驗證框架/引擎協(xié)作,它并不要求用戶使用DataAnnotation驗證方式,所有的基礎(chǔ)設(shè)施是獨立于DataAnnotation的,可以與Castle驗證器、EntLib驗證應(yīng)用塊,或者用戶選擇的任何定制驗證方案協(xié)作使用。如果用戶不想使用我們的客戶端JavaScript文件,那么也可以將其替換成jQuery驗證插件,而使用那個庫。ASP.NETMVCFutures的下載包還包括針對ASP.NETMVC4服務(wù)器端驗證框架啟用jQuery驗證的支持。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗Step04:創(chuàng)建自定義的[Email]驗證特性。.NET框架中的System.ComponentModel.DataAnnotations命名空間包括了眾多內(nèi)置驗證特性。在上面的例子中,使用了其中的4個:[Required]、[StringLength]、[Range]和[RegularExpression]。用戶也可以定義自己的定制驗證特性,然后應(yīng)用它們。用戶可以通過繼承自System.ComponentModel.DataAnnotations命名空間中的ValidationAttribute基類,定義完全定制的特性。如果用戶只想擴展它們的基本功能,那么也可以選擇繼承任何現(xiàn)有的驗證特性。例如,為了幫助清理Person類中的代碼,我們也許想要創(chuàng)建一個新的[Email]驗證特性,將檢查合法Email的正則表達(dá)式封裝起來。如果想要這樣做的話,那么只要像下列代碼那樣繼承RegularExpressionAttribute基類,然后用合適的Email正則表達(dá)式調(diào)用RegularExpressionAttribute基類的構(gòu)造器即可。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗然后將Person類更新成使用新的[Email]驗證屬性,換掉先前使用的正則表達(dá)式,這樣會使得我們的代碼更簡潔,封裝效果也更好。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗在建立定制的驗證特性時,用戶還可以在服務(wù)器端及客戶端指定通過JavaScript執(zhí)行的驗證邏輯。除了建立可用于對象上個別屬性的驗證特性外,還可以將驗證特性用于類的層次,這允許對一個對象中的多個屬性實施驗證邏輯。若要查看相關(guān)案例,可以參閱包含在默認(rèn)ASP.NETMVC4應(yīng)用項目模板AccountModels.cs/vb文件中的“PropertiesMustMatchAttribute”定制特性(在VisualStudio2010中,選擇“文件”→“新ASP.NETMVC4Web項目”,然后查詢該類)。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證第二章模型2.4模型的數(shù)據(jù)校驗Step05:邏輯層的需求校驗。校驗中除了基本的長度、必填、范圍等之外,還有符合邏輯要求的校驗。這些校驗除了用上面的自定義方法之外,還可以在控制層進行相關(guān)的檢驗。2.4.1非數(shù)據(jù)庫類DataAnnotation啟用驗證在上述代碼段的相應(yīng)位置可以自己編寫相關(guān)的方法進行校驗。第二章模型2.4模型的數(shù)據(jù)校驗Step06:邏輯層的需求校驗?,F(xiàn)在讓我們實現(xiàn)將朋友數(shù)據(jù)保存到數(shù)據(jù)庫所需的邏輯。至此,我們只用了簡單的(plain-old)C#類(有時稱為“POCO”類,即“plainoldCLR(orC#)object”)。我們可以使用的一個方案是,編寫一些單獨的持久代碼,將已經(jīng)編寫好的現(xiàn)有類映射到數(shù)據(jù)庫。目前,像NHibernate這樣的對象關(guān)系映射(ObjectRelationalMapping,ORM)方案已經(jīng)可以非常好地支持POCO/PI這樣風(fēng)格的映射。隨.NET4發(fā)布的ADO.NET實體框架(EntityFramework,EF)也支持POCO/PI映射,而且就像NHibernate那樣,EF也能使用以“只用代碼”(codeonly)的方式(沒有映射文件,也不需要設(shè)計器)定義持久性映射的功能。如果我們的Person對象以這種方式
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年二手購房合同協(xié)議范文(2篇)
- 2025年個人租房的勞動合同范文(2篇)
- 圖書物流配送協(xié)議樣本
- 醫(yī)療診所裝修施工合同范例
- 國際海鮮配送服務(wù)合同
- 機場自動扶梯裝修項目合同
- 水上樂器運輸協(xié)議
- 親子樂園裝修安全合同樣本
- 保險代理居間合作協(xié)議樣本
- 醫(yī)院病房防水翻新合同
- 語言和語言學(xué)課件
- 《工作場所安全使用化學(xué)品規(guī)定》
- 裝飾圖案設(shè)計-裝飾圖案的形式課件
- 2022年菏澤醫(yī)學(xué)??茖W(xué)校單招綜合素質(zhì)考試筆試試題及答案解析
- 護理學(xué)基礎(chǔ)教案導(dǎo)尿術(shù)catheterization
- ICU護理工作流程
- 廣東版高中信息技術(shù)教案(全套)
- 市政工程設(shè)施養(yǎng)護維修估算指標(biāo)
- 短視頻:策劃+拍攝+制作+運營課件(完整版)
- 石家莊鐵道大學(xué)四方學(xué)院畢業(yè)設(shè)計46
- 分布式光伏屋頂調(diào)查表
評論
0/150
提交評論