Adding Validation to the Model ,在Model中添加數據驗證數據庫
本文內容:服務器
這一節咱們在Movie Model中添加邏輯驗證(validation logic),從而確保咱們在頁面中新增和編輯的時候錄入的數據是正確的合法的。
ASP.NET MVC一個核心的代碼設計原則(code design tenets)是DRY(Don’t Repeat Yourself).ASP.NET鼓勵你一樣功能的方法或者行爲只須要指定一次,而後在項目中全部須要的地方很容易的體現出來。這樣減小了你寫代碼的總量,而且讓你的代碼更不容易出錯,而且更好控制。mvc
ASP.NET MVC和Entity Framework Code First提供的這種驗證(validation)就是DRY原則的一個很好的例子。你只須要在一個地方(model class)聲明驗證規則(validation),這個規則就會在項目中的每個調用model class的地方(insert,edit)進行驗證。
咱們如今來看一下,在movie applicaton中添加validation的好處
1、Add Validation Rules to the Movie Model 在Movie Model中添加一些邏輯驗證規則
Movie.cs中添加命名空間:using System.ComponentModel.DataAnnotations;app
這個命名空間提供了一組內置(build-in)的驗證屬性,這些驗證屬性能夠聲明在Model類中的字段屬性前面,對字段屬性進行驗證。
如今咱們用這些內置的Validation Rule [Required],[StringLength],[Range]更新Model Classasp.net
Ctrl+F5運行程式:ide
這是由於咱們更新了Movie Class,Code First檢查到movie和datebase中不一致,因此拋出了錯誤,如今咱們用Migrations功能來更新database中的table.post
更新前database中table的定義:ui
執行migrations功能更新db:spa
PM>add-migration AddDataAnnotationsMig
PM>update-database
刷新資料庫後咱們看到Table的定義和movie class進行了同步:
1,Title不能爲空2,Genre不能爲空,3,Rating 的長度爲5
Migrations完成之後,Migrations文件夾下面添加了新了遷移類文件:
遷移類的Up方法更新了表中的約束,Titel,Genre不能爲空,Rating字段的長度爲5
這些validation attributes 對model class中字段進行約束。Required表明字段必須有值,Range 表明字段值須要在特定的範圍以內,StringLength表明字段值的最大長度,默認狀況下是任意長度。其餘的一些validations attribute例如:decimal,int,float,DateTime默認不能爲空的,因此前面不用再加[Required]
Code First 機制會確保在model class加的validation rules會在網頁數據保存到database以前執行。例如,咱們在movie class的index方法中添加下面的code在執行到SaveChanges()方法的時候就會拋出錯誤,由於movie的部分屬性丟失,而且價格爲0不在(1-100)之間。
調試彈出錯誤:
這種由.NET Framework自動執行的驗證機制(validation rules)可讓你的代碼更增強健。也會確保你忘記對數據進行驗證或者是不當心疏忽把錯誤的數據錄入database.
2、 頁面上的驗證提示Validation Error UI in ASP.NET MVC
咱們添加一個新的movie:
咱們填寫的數據不符合規則,當鼠標移開文本框的時候,頁面就提示咱們輸入的數據不合法,這樣的機制在客戶端和服務器端都保證了數據符合規則。這樣最大的好處就是,你不用再像ASP.NET那樣在後臺或者前臺添加單獨的代碼對全部錄入的數據一一進行判斷是否符合規則。Controller和Views自動就會調用model class 中指定的validations rules來檢查數據。
咱們再來看一下Title和Genre ,這兩個字段,movie class中對這兩個字段只添加了[Require]的validation attribute,咱們沒有輸入的時候也沒有紅色提示說必須輸入。可是一旦咱們提交按鈕,或者輸入文字後鼠標焦點移開文本框就會有提示說是必填字段。
當頁面中全部的數據都是正確的時候,頁面數據纔會提交到server端
3、 驗證是如何在View中和 Action方法中實現的
咱們會想,咱們只是在movie class中添加了[Require]之類的validation attribute。並無在view和action方法中添加驗證,那麼view和action方法是若是實現對數據的驗證的呢?
咱們先看一下Action Method中的post請求的create方法。方法中調用了ModelState.IsValid
來驗證頁面提交過來的movie model是否合法,若是不合法,Create
方法就會再次返回到form裏面去,若是數據正確,Create方法就會把新的數據保存到數據庫
因爲咱們頁面段有JavaScript驗證,若是數據不合法頁面就直接提示錯誤,就不會把數據經過POST方法提交的服務器。如今咱們禁用頁面的JavaScript檢查,來看一下Action Method具體是如何對數據進行驗證的。
1,禁用瀏覽器的JavaScript,頁面就不會提示數據錯誤了
2,在ActionResult Create中下斷點,調試咱們看到,前臺頁面不會報錯:
可是ModelState.IsValid==false
頁面直接return view,頁面提示數據錯誤:
咱們再來看一下View中時若是對這些數據進行檢查的:
Html.EditorFor
至關於HTML中的<input>文本框,表明movie中的屬性
Html.ValidationMessageFor
對<input>中的數據進行檢查
這兩個Html Helper方法從Controller中接收數據,並自動查詢Model中的驗證屬性,並提示錯誤的信息。
這樣的驗證機制,View和Controller中根本不知道數據驗證規則(validation rule),這個規則只須要寫在Model Class中,這些驗證就自動套用到其餘須要的views template中,例如create template and edit tempalte.
若是你想更改valudation rule ,你只須要在model class中進行更改, view和controller中默認就會執行這個驗證。這就是DRY原則
4、 在Movie Model中添加格式驗證Adding Formatting to the Movie Model System.ComponentModel.DataAnnotations;
一樣提供了一組內置的格式屬性,在view template中顯示 Model中的數據對應的格式,如時間格式.
DataType Attribute 並不會對數據格式進行驗證,他們只是告訴View頁面改如何顯示數據,例如DataType.Date
attribute顯示不帶小時的日期相似的DataType Attribute還有:URL,PhoneNumber等. RegularExpression attribuate 被用來對數據的格式進行驗證
咱們一樣能夠用一組DataFormatString
來指定數據應該以怎樣的格式呈現。
補充:若是咱們更新Model中的Validation Attribuate例如,把Rating的字段長度改成8,[StringLength(8)]運行的時候會提示「由於創建了資料庫,支援 'MovieDBContext' 內容的模型已經變更」的錯誤。咱們更新Configuration的AutomaticMigrationsEnabled爲True
PM>update-database
Ctrl+Shift+B重建,Ctrl+F5執行.
下一節咱們會再詳細看一下Detail Template 和 Delete Template
See You …