ASP.NET MVC 學習七、爲Model Class的字段添加驗證屬性(validation attribuate)

Adding Validation to the ModelModel中添加數據驗證數據庫

參考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model瀏覽器


本文內容:服務器

這一節咱們在Movie Model中添加邏輯驗證(validation logic),從而確保咱們在頁面中新增和編輯的時候錄入的數據是正確的合法的。

ASP.NET MVC一個核心的代碼設計原則(code design tenets)是DRY(Don’t Repeat Yourself).ASP.NET鼓勵你一樣功能的方法或者行爲只須要指定一次,而後在項目中全部須要的地方很容易的體現出來。這樣減小了你寫代碼的總量,而且讓你的代碼更不容易出錯,而且更好控制。mvc


ASP.NET MVCEntity 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

   // Moive 類就至關於數據庫中的一張名爲Movie的Table
    
// Movie 類實例化的對象至關於Table中的一行,實例的各個屬性(ID,Title...)至關於Table中的列
     public  class Movie
    {
         public  int ID {  getset; }

        [Required]
         public  string Title {  getset; }

         // [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString= " {0:d} ")]
         public DateTime ReleaseDate {  getset; }

        [Required]
         public  string Genre {  getset; }

        [Range( 1100)]
         // [DataType(DataType.Currency)]
       [DisplayFormat(DataFormatString =  " {0:c} ")]
         public  decimal Price {  getset; }

        [StringLength( 5)]
         public  string Rating {  getset; }
    }
View Code

Ctrl+F5運行程式:ide


這是由於咱們更新了Movie Class,Code First檢查到moviedatebase中不一致,因此拋出了錯誤,如今咱們用Migrations功能來更新database中的table.post

更新前databasetable的定義:ui


執行migrations功能更新db:spa

PM>add-migration AddDataAnnotationsMig
PM>update-database

刷新資料庫後咱們看到Table的定義和movie class進行了同步:

1,Title不能爲空2Genre不能爲空,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 classindex方法中添加下面的code在執行到SaveChanges()方法的時候就會拋出錯誤,由於movie的部分屬性丟失,而且價格爲0不在(1-100)之間。

   public ActionResult Index()
        {
            MovieDBContext db =  new MovieDBContext();

            Movie movie =  new Movie();
            movie.Title =  " Gone with the Wind ";
            movie.Price =  0.0M;

            db.Movies.Add(movie);
            db.SaveChanges();         //  <= Will throw server side validation exception  

             return View(db.Movies.ToList());
        }
View Code

調試彈出錯誤:

 

這種由.NET Framework自動執行的驗證機制(validation rules)可讓你的代碼更增強健。也會確保你忘記對數據進行驗證或者是不當心疏忽把錯誤的數據錄入database.

 

2、     頁面上的驗證提示Validation Error UI in ASP.NET MVC
咱們添加一個新的movie

咱們填寫的數據不符合規則,當鼠標移開文本框的時候,頁面就提示咱們輸入的數據不合法,這樣的機制在客戶端和服務器端都保證了數據符合規則。這樣最大的好處就是,你不用再像ASP.NET那樣在後臺或者前臺添加單獨的代碼對全部錄入的數據一一進行判斷是否符合規則。ControllerViews自動就會調用model class 中指定的validations rules來檢查數據。


咱們再來看一下TitleGenre ,這兩個字段,movie class中對這兩個字段只添加了[Require]validation attribute,咱們沒有輸入的時候也沒有紅色提示說必須輸入。可是一旦咱們提交按鈕,或者輸入文字後鼠標焦點移開文本框就會有提示說是必填字段。

 

當頁面中全部的數據都是正確的時候,頁面數據纔會提交到server

 

3、     驗證是如何在View中和 Action方法中實現的

咱們會想,咱們只是在movie class中添加了[Require]之類的validation attribute。並無在viewaction方法中添加驗證,那麼viewaction方法是若是實現對數據的驗證的呢?
咱們先看一下Action Method中的post請求的create方法。方法中調用了ModelState.IsValid驗證頁面提交過來的movie model是否合法,若是不合法,Create方法就會再次返回到form裏面去,若是數據正確,Create方法就會把新的數據保存到數據庫

  [HttpPost]
         public ActionResult Create(Movie movie)
        {
             if (ModelState.IsValid)
            {
                db.Movies.Add(movie);
                db.SaveChanges();
                 return RedirectToAction( " Index ");
            }

             return View(movie);
        }
View Code

 

因爲咱們頁面段有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中的驗證屬性,並提示錯誤的信息。

這樣的驗證機制,ViewController中根本不知道數據驗證規則(validation rule),這個規則只須要寫在Model Class中,這些驗證就自動套用到其餘須要的views template中,例如create template and edit tempalte.

若是你想更改valudation rule ,你只須要在model class中進行更改, viewcontroller中默認就會執行這個驗證。這就是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' 內容的模型已經變更」的錯誤。咱們更新ConfigurationAutomaticMigrationsEnabledTrue


PM>update-database


Ctrl+Shift+B重建,Ctrl+F5執行.

下一節咱們會再詳細看一下Detail Template Delete Template

See You …

相關文章
相關標籤/搜索