ASP.NET MVC 2 验证
來源:http://www.cnblogs.com/jhxk/articles/2612885.html? 只為把自己覺的好的存起來
對用戶輸入的驗(yàn)證以及強(qiáng)制業(yè)務(wù)規(guī)則/邏輯是大多數(shù)web應(yīng)用的核心需求。ASP.NET MVC 2包含了一堆新的特性,顯著地簡化了對用戶輸入的驗(yàn)證以及在模型/視圖模型中對驗(yàn)證邏輯的強(qiáng)行實(shí)施。這些特性是這樣設(shè)計(jì)的,驗(yàn)證邏輯總是在服務(wù)器上執(zhí)行的,也可以選擇在客戶端通過JavaScript來執(zhí)行。ASP.NET MVC 2中的驗(yàn)證設(shè)施和特性這般設(shè)計(jì),以便:
1) 開發(fā)人員可以輕易地利用內(nèi)置于.NET框架中的DataAnnotation驗(yàn)證支持。DataAnnotation提供了一個(gè)非常簡便的方式,使用最少的代碼在對象和屬性上用聲明的方式添加驗(yàn)證規(guī)則。
2) 開發(fā)人員可以集成他們自己的驗(yàn)證引擎,或者利用現(xiàn)有的驗(yàn)證框架,象Castle驗(yàn)證器或EntLib驗(yàn)證庫。ASP.NET MVC 2的驗(yàn)證特性是設(shè)計(jì)來在利用新的 ASP.NET MVC 2的驗(yàn)證設(shè)施(包括客戶端驗(yàn)證,模型綁定驗(yàn)證等等)的同時(shí),簡化任何類型的驗(yàn)證架構(gòu)的插入的。
這意味著,在常見的應(yīng)用場景中啟用驗(yàn)證是極其容易的,同時(shí)對更高級的場景則還能保持極好的靈活性。
使用ASP.NET MVC 2 和 DataAnnotation來啟用驗(yàn)證
讓我們在ASP.NET MVC 2中來全程示范一個(gè)簡單的CRUD場景,利用新的內(nèi)置DataAnnotation驗(yàn)證支持。具體來說,讓我們來實(shí)現(xiàn)一個(gè)“Create”表單來允許用戶輸入朋友的數(shù)據(jù):
我們想要確保在保存到數(shù)據(jù)庫之前,輸入的信息是合法的,如果不合法,就顯示合適的錯(cuò)誤消息:
我 們想要使得這個(gè)驗(yàn)證同時(shí)在服務(wù)器端和客戶端(通過 JavaScript)發(fā)生。我們還想要確保我們的代碼遵守DRY原則(Don't Repeat Yourself,不重復(fù)自己),意味著我們應(yīng)該只在一處實(shí)施驗(yàn)證規(guī)則,然后使得我們的控制器,action方法和視圖來兌現(xiàn)這個(gè)承諾。
在下面,我將使用VS 2010,用ASP.NET MVC 2來實(shí)現(xiàn)上面的場景。你也可以使用VS 2008及ASP.NET MVC 2來實(shí)現(xiàn)完全一樣的場景。
第一步: 實(shí)現(xiàn)FriendsController (一開始沒有驗(yàn)證)
我們首先在一個(gè)新的ASP.NET MVC 2項(xiàng)目中加一個(gè)簡單的“Person”類,象下面這樣:
它有四個(gè)屬性(是用C#的自動(dòng)屬性支持實(shí)現(xiàn)的, 在VS 2010中VB也支持自動(dòng)屬性了,哎!)。
然后在項(xiàng)目中加一個(gè) “FriendsController” 控制器類,呈示2個(gè) “Create” action方法。第一個(gè)action方法是在對/Friends/Create URL的HTTP-GET請求進(jìn)來時(shí)調(diào)用的,它會(huì)顯示一個(gè)空白的表單,用來輸入個(gè)人數(shù)據(jù)。第二個(gè)action方法是在對/Friends/Create URL的HTTP-POST請求進(jìn)來時(shí)調(diào)用的。它會(huì)將提交的表單輸入映射到一個(gè)Person對象,核實(shí)沒有綁定錯(cuò)誤發(fā)生,如果是合法的,最終會(huì)將數(shù)據(jù)保存 到數(shù)據(jù)庫中去(在本教程的后面我們會(huì)實(shí)現(xiàn)相關(guān)的數(shù)據(jù)庫工作)。如果提交的表單輸入是不合法的,該action方法會(huì)重新顯示帶有錯(cuò)誤的表單:
在實(shí)現(xiàn)了控制器之后,可以在Visual Studio中在其中一個(gè)action方法中右擊,選擇 “添加視圖”命令, 這會(huì)調(diào)出 “添加視圖” 對話框。選擇自動(dòng)生成傳入對象為Person的“Create”視圖:
然后Visual Studio會(huì)在我們項(xiàng)目的\Views\Friends\目錄中,生成一個(gè)含有框架代碼(scaffolded)的Create.aspx視圖文件。注意下面,它利用了ASP.NET MVC 2中新的強(qiáng)類型HTML輔助方法(促成了更好的intellisense和編譯時(shí)檢查支持):
現(xiàn)在,當(dāng)我們運(yùn)行該應(yīng)用,訪問 /Friends/Create URL時(shí),我們將得到一張可以輸入數(shù)據(jù)的空白表單:
但,因?yàn)槲覀冞€沒有在應(yīng)用中實(shí)現(xiàn)任何驗(yàn)證,誰也無法阻止我們在表單中鍵入假的輸入,將其提交到服務(wù)器去。
第二步: 使用DataAnnotation來啟用驗(yàn)證
現(xiàn)在,讓我們來更新應(yīng)用,執(zhí)行一些基本的輸入驗(yàn)證規(guī)則。我們將在我們的Person模型對象上實(shí)現(xiàn)這些規(guī)則,而不是在控制器或視圖中實(shí)現(xiàn)。在Person對象上實(shí)現(xiàn)這些規(guī)則的好處是,這將確保這些驗(yàn)證在應(yīng)用中任何使用Person對象的場景中都會(huì)被執(zhí)行(例如,如果后來添加了編輯場景的話)。這將幫助確保我們將代碼保持DRY,避免在多處重復(fù)這些規(guī)則。
ASP.NET MVC 2 允許開發(fā)人員輕松地在模型或視圖模型類上添加聲明式驗(yàn)證特性,然后ASP.NET MVC在應(yīng)用中實(shí)施模型綁定操作時(shí),這些驗(yàn)證規(guī)則就會(huì)被自動(dòng)執(zhí)行。為看其例子,讓我們更新Person類,在其中加幾個(gè)驗(yàn)證特性。這么做,在文件的頂部加 一個(gè)對“System.ComponentModel.DataAnnotations”命名空間的 “using” 語句,然后在Person的屬性上飾于[Required], [StringLength], [Range], 和 [RegularExpression] 驗(yàn)證特性(這幾個(gè)特性都是在那個(gè)命名空間中實(shí)現(xiàn)的):
注: 在上面我們明式指定了錯(cuò)誤信息字符串,你也可以在資源文件中定義它們,或者按進(jìn)來的用戶的語言/文化做本地化,你可以在這里了解如何本地化驗(yàn)證錯(cuò)誤消息。
既然我們加了驗(yàn)證特性到Person類上,讓我們來重新運(yùn)行我們的應(yīng)用,看在鍵入假的數(shù)值,將其提交回服務(wù)器時(shí)會(huì)發(fā)生什么:
注意上面我們的應(yīng)用現(xiàn)在有一個(gè)蠻好的出錯(cuò)體驗(yàn)了。帶不合法輸入的文本元素以紅色高亮顯示,我們指定的驗(yàn)證錯(cuò)誤消息也顯示給了用戶。表單還保留用戶原先輸入的數(shù)據(jù),這樣他們不用重新填寫什么。但,你也許會(huì)問,怎么會(huì)是這樣?
要理解這個(gè)行為,讓我們看一下處理我們表單的POST場景的Create action方法:
在 我們的HTML表單被提交回服務(wù)器時(shí),上面的方法就會(huì)被調(diào)用。因?yàn)樵揳ction方法接受一個(gè)“Person” 對象為參數(shù),ASP.NET MVC會(huì)創(chuàng)建一個(gè)Person對象,自動(dòng)地將進(jìn)來的表單輸入數(shù)值映射到該對象上。作為該過程的一部分,ASP.NET MVC還會(huì)檢查該P(yáng)erson對象上的DataAnnotation驗(yàn)證特性是否合法。如果一切都合法,那么我們代碼中的 ModelState.IsValid檢查就會(huì)返回真值,在這種情形下,我們(最終)將把該P(yáng)erson對象保存到數(shù)據(jù)庫中,然后重新定向回到主頁上去。
但如果Person對象上有任何驗(yàn)證錯(cuò)誤的話,我們的action方法就會(huì)以該不合法Person對象的數(shù)據(jù)重新顯示表單,這是通過上面代碼片段中最后一行代碼實(shí)現(xiàn)的。
然 后,錯(cuò)誤消息就會(huì)顯示在我們的視圖中,因?yàn)槲覀兊腃reate表單在每一個(gè)<%= Html.TextBoxFor() %>輔助方法的調(diào)用旁邊都有一個(gè)<%= Html.ValidationMessageFor() %>輔助方法調(diào)用。Html.ValidationMessageFor() 輔助方法會(huì)針對傳入視圖的任何不合法的模型屬性輸出合適的錯(cuò)誤消息:
這個(gè)模式/方式有一個(gè)好處,就是非常容易配置,它還允許我們輕松地添加或改變我們Person類上的驗(yàn)證規(guī)則,而不必改變控制器或視圖中的任何代碼。這個(gè)在一個(gè)地方指定驗(yàn)證規(guī)則,然后在所有的地方都會(huì)被承諾和遵守的能力,允許我們以最少的努力快速地發(fā)展我們的應(yīng)用和規(guī)則,并且將代碼保持在非常DRY的程度。
第三步: 啟用客戶端驗(yàn)證
目前我們的應(yīng)用只能做服務(wù)器端的驗(yàn)證,這意味著我們的終端用戶需要將表單提交到服務(wù)器才能看到任何驗(yàn)證錯(cuò)誤消息。
ASP.NET MVC 2的驗(yàn)證架構(gòu)中一樣非常酷的東西是,它同時(shí)支持服務(wù)器端 和 客戶端驗(yàn)證。為啟用這個(gè)功能,我們要做的就是在視圖中添加2個(gè) JavaScript引用,編寫一行代碼:
在我們添加了這三行后,ASP.NET MVC 2 就會(huì)使用我們加到Person類上的驗(yàn)證元數(shù)據(jù),為我們連接好客戶端JavaScript驗(yàn)證邏輯。這意味著,當(dāng)用戶使用tab鍵跳出一個(gè)不合法的輸入元素時(shí),就會(huì)得到瞬時(shí)的驗(yàn)證錯(cuò)誤。
要在我們的朋友應(yīng)用中看客戶端JavaScript支持的實(shí)戰(zhàn)例子的話,讓我們重新運(yùn)行應(yīng)用,在前三個(gè)文本框中填入合法的數(shù)值,然后嘗試點(diǎn)擊“Create(創(chuàng)建)”。注意,我們不必訪問服務(wù)器就會(huì)得到遺漏值的瞬時(shí)錯(cuò)誤消息:
如果我們輸入一些不是合法的email的字符話,錯(cuò)誤消息就會(huì)瞬時(shí)從“Email Required (Email是個(gè)必需值)” 變?yōu)?“Not a valid email (email不合法)”(這是我們將規(guī)則加到Person類上時(shí)指定的錯(cuò)誤消息):
在輸入一個(gè)合法的email時(shí),錯(cuò)誤消息就是瞬時(shí)消失,文本框背景色也會(huì)恢復(fù)到正常的狀態(tài):
好事是,我們不必編寫自己的任何定制JavaScript就能啟用上面的驗(yàn)證邏輯。我們的驗(yàn)證代碼還是那么DRY,我們可以在一個(gè)地方指定規(guī)則,然后在整個(gè)應(yīng)用中得到執(zhí)行,同時(shí)在客戶端和服務(wù)器端。
注意,為安全的原因,服務(wù)器端驗(yàn)證規(guī)則總是執(zhí)行的,即時(shí)你啟用了客戶端支持。這避免黑客嘗試?yán)@過客戶端規(guī)則,哄騙攻擊(spoof)你的服務(wù)器。
ASP.NET MVC 2中的客戶端JavaScript驗(yàn)證支持可與你在ASP.NET MVC應(yīng)用中使用的任何驗(yàn)證框架/引擎協(xié)作,它并不要求你使用 DataAnnotation 驗(yàn)證方式,所有的基礎(chǔ)設(shè)施是獨(dú)立于 DataAnnotation的,可以與Castle驗(yàn)證器, EntLib驗(yàn)證應(yīng)用塊,或你選擇使用的任何定制驗(yàn)證方案協(xié)作使用。
如果你不想使用我們的客戶端JavaScript文件,你也可以將其替換成jQuery驗(yàn)證插件,而使用那個(gè)庫。 ASP.NET MVC Futures下載還包括針對ASP.NET MVC 2服務(wù)器端驗(yàn)證框架啟用jQuery驗(yàn)證的支持。
第四步: 創(chuàng)建自定義的[Email]驗(yàn)證特性
.NET 框架中的System.ComponentModel.DataAnnotations命名空間包括了眾多可為你所用的內(nèi)置驗(yàn)證特性。我們在上面的例子中 使用了其中的四個(gè):[Required], [StringLength], [Range], 和 [RegularExpression]。
你 也可以定義自己的定制驗(yàn)證特性,然后應(yīng)用它們。你可以通過繼承自System.ComponentModel.DataAnnotations命名空間中 的ValidationAttribute基類,定義完全定制的特性。或者,你也可以選擇繼承自任何現(xiàn)有的驗(yàn)證特性,如果你只想要擴(kuò)展它們的基本功能的 話。
例如,為幫助清理我們Person類中的代碼,我們也許想要?jiǎng)?chuàng)建一個(gè)新的[Email]驗(yàn)證特性,將檢查合法email的正則表達(dá) 式封裝起來。要這么做的話,我們只要象這樣繼承自RegularExpressionAttribute基類,然后用合適的email正則表達(dá)式調(diào)用 RegularExpressionAttribute基類的構(gòu)造器:
然后將Person類更新成使用我們新的[Email]驗(yàn)證屬性,換掉我們先前使用的正則表達(dá)式,這使得我們的代碼更干凈,封裝也更好:
在創(chuàng)建定制的驗(yàn)證特性時(shí),你還可以指定在服務(wù)器端以及在客戶端通過JavaScript執(zhí)行的驗(yàn)證邏輯。
除 了創(chuàng)建可施用于對象上個(gè)別屬性的驗(yàn)證特性外,你還可以將驗(yàn)證特性施用于類的層次,這允許你對一個(gè)對象中的多個(gè)屬性實(shí)施驗(yàn)證邏輯。要看實(shí)戰(zhàn)例子的話,你可以 參閱包含在默認(rèn)ASP.NET MVC 2應(yīng)用項(xiàng)目模板中AccountModels.cs/vb文件中的“PropertiesMustMatchAttribute” 定制特性(在VS 2010中做 文件->新ASP.NET MVC 2 Web項(xiàng)目,然后查詢該類)。
第五步: 持久化到數(shù)據(jù)庫中
現(xiàn)在讓我們來實(shí)現(xiàn)將朋友數(shù)據(jù)保存到數(shù)據(jù)庫所需的邏輯。
至 此,我們只用了平白的(plain-old)C#類(有時(shí)稱為“POCO” 類, 即 “plain old CLR (or C#) object”)。我們可以使用的一個(gè)方案是,編寫一些單獨(dú)的持久代碼,將這我們已經(jīng)編寫好的現(xiàn)有類映射到數(shù)據(jù)庫去。目前象NHibernate這樣的對 象關(guān)系映射(Object relational mapping - ORM)方案非常地好支持這樣的POCO/PI風(fēng)格的映射。隨.NET 4發(fā)布的ADO.NET實(shí)體框架(Entity Framework - EF)也支持POCO / PI映射,而且就象NHibernate,EF也能啟用以“只用代碼(code only)”的方式(沒有映射文件,也不需要設(shè)計(jì)器)定義持久性映射的能力。
如果我們的Person對象以這種方式映射到數(shù)據(jù)庫的話,我們不用對Person類做任何改動(dòng),也不用改動(dòng)任何驗(yàn)證規(guī)則,它還會(huì)繼續(xù)完好地工作。
但假如我們要使用圖形工具來做ORM映射的話,怎么辦?
今天使用Visual Studio的許多開發(fā)人員并不編寫他們自己的ORM映射/持久邏輯,而是使用Visual Studio中內(nèi)置的設(shè)計(jì)器來幫助管理這樣的映射邏輯。
使 用DataAnnotation(或者任何其他形式的基于特性的驗(yàn)證)時(shí)一個(gè)經(jīng)常問起的問題是,“如果你手頭的模型對象是由GUI設(shè)計(jì)器創(chuàng)建/維護(hù)的話, 你該如何施用這些特性?”。例如,假如與類似我們至此為止一直在使用的POCO風(fēng)格的Person類不同,我們而是在Visual Studio中通過象LINQ to SQL 或 ADO.NET EF設(shè)計(jì)器這樣的GUI映射工具定義/維護(hù)我們的Person類的話,該怎么辦呢:
上 面是一張屏幕截圖,展示了在VS 2010中使用ADO.NET EF設(shè)計(jì)器定義的一個(gè)Person類。上方的窗口定義了Person類,下方的窗口展示了該類的屬性是如何映射到數(shù)據(jù)庫中的“People”表的映射編輯 器。當(dāng)你在設(shè)計(jì)器上點(diǎn)擊保存時(shí),它會(huì)自動(dòng)為你在項(xiàng)目中生成一個(gè)Person類。這很棒,但每次你做了改動(dòng),點(diǎn)擊保存時(shí),它就會(huì)重新生成 Person 類,這會(huì)導(dǎo)致你在對象上面聲明的任何驗(yàn)證特性的丟失。
將 額外的基于特性的元數(shù)據(jù)(象驗(yàn)證特性)施加到由VS設(shè)計(jì)器自動(dòng)生成/維護(hù)的類的一個(gè)方法是,采用一個(gè)我們稱之為“伙伴類(buddy classes)”的技術(shù)。基本上來說,你創(chuàng)建另外一個(gè)類,包含你的驗(yàn)證特性和元數(shù)據(jù),然后通過將 “MetadataType”特性施加到一個(gè)與工具生成的類一起編譯的partial類上,將其與由設(shè)計(jì)器生成的類連接起來。例如,如果我們想要將我們前 面用到的驗(yàn)證規(guī)則施加到由LINQ to SQL 或 ADO.NET EF設(shè)計(jì)器維護(hù)的Person類上,我們可以更新我們的驗(yàn)證代碼,使其存在于一個(gè)單獨(dú)的“Person_Validation”類上,使用象下面這樣的代 碼將其連接到由VS創(chuàng)建的“Person”類上:
上面的做法沒有純粹的POCO方法那么優(yōu)雅,但其好處是,可以用于Visual Studio中任何工具或設(shè)計(jì)器生成的代碼。
最后一步 – 將Friend保存到數(shù)據(jù)庫中
最后一步,不管是否采用了POCO或工具生成的Person類,是將合法的朋友數(shù)據(jù)保存到數(shù)據(jù)庫中去。
這只要求我們用三行代碼將FriendsControlle類中的 “Todo”占位語句替換掉,這三行代碼將新朋友保存到數(shù)據(jù)庫。下面是整個(gè)FriendsController類的完整代碼(使用了ADO.NET EF做數(shù)據(jù)庫持久化):
現(xiàn)在,當(dāng)我們訪問 /Friends/Create URL時(shí),我們可以輕松地添加新人到我們的朋友數(shù)據(jù)庫中去:
對所有數(shù)據(jù)的驗(yàn)證都是同時(shí)在客戶端和服務(wù)器端執(zhí)行的。我們可以輕易地在一個(gè)地方添加/修改/刪除驗(yàn)證規(guī)則,而由整個(gè)應(yīng)用中的所有的控制器和視圖來執(zhí)行這些規(guī)則。
結(jié)語
ASP.NET MVC 2極大地簡化了web應(yīng)用的驗(yàn)證集成。它倡議一種基于模型的驗(yàn)證方式,允許你將你的應(yīng)用保持DRY,幫助確保驗(yàn)證規(guī)則在整個(gè)應(yīng)用中保持一致。 ASP.NET MVC 2中內(nèi)置的DataAnnotation支持,原本就使得對常見的驗(yàn)證場景的支持非常容易。而且,ASP.NET MVC 2驗(yàn)證設(shè)施中的擴(kuò)展性支持允許你支持更大范圍的更高級的驗(yàn)證場景,可以插入任何現(xiàn)有的或者定制的驗(yàn)證框架/引擎。
轉(zhuǎn)載于:https://www.cnblogs.com/99app/p/3498472.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET MVC 2 验证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝借呗利息是多少
- 下一篇: 在WPF的DATAGRID中快速点击出现