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 …

相关文章
相关标签/搜索