本节我们将为Movie类型增加逻辑验证,以确保任何用户试图使用该应用程序创建或编辑影片时执行验证规则。
ASP.NET MVC的核心原则之一是干爽(“不需要自己重复”)。ASP.NET MVC鼓励我们只指定一次功能或行为,然后在应用程序中到处使用。这种做法减少了需要编写的代码量,使你的代码编写不容易出错,且更容易维护。
ASP.NET MVC和Entity Framework代码先行为验证提供支持,是干爽原则应用的一个很好的例子。在一个模型的类中以声明方式指定验证规则,在整个应用程序中执行验证规则。
public class Movie
{
public int ID { get; set; }
[Required]
public string Name { get; set; }
public string Genra { get; set; }
[Range(1,100)]
public decimal Price { get; set; }
public DateTime Date { get; set; }
[StringLength(5)]
public string Rating { get; set; }
}
复制代码
运行程序后我们会再次遇到错误:
The model backing the 'MovieDBContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).
复制代码
按照上节的学习,先在库管理器控制台中执行add-migration AddDataAnnotationsMig命令,再执行update-database命令,查看AddDataAnnotationsMig文件,其中的Up方法,可以看到Name字段不能为空,Rating属性最大长度为5.
public override void Up()
{
AlterColumn("dbo.Movies", "Name", c => c.String(nullable: false));
AlterColumn("dbo.Movies", "Rating", c => c.String(maxLength: 5));
}
复制代码
验证属性指定应用到模型属性要执行的行为。Required属性表示属性不能为空,在本示例中,影片名称必须有值。Range范围属性限制在指定的范围内。StringLength属性可设定字符串的最大长度,以及最小长度(可选)。内建类型(如decimal,int,float,DateTime)默认情况下,并不需要Required属性。
代码先行确保应用程序将更改保存到数据库前你指定的模型类的验证规则被执行。例如下面的代码调用SaveChanges方法时将抛出一个异常,因为不能为空的片名属性值没有值,以及价格是零(不在有效范围内)。
MovieDbContext db = new MovieDbContext();
Movie movie = new Movie();
movie.Title = "";
movie.Price = 0.0M;
db.Movies.Add(movie);
db.SaveChanges();
复制代码
.NET Framework自动执行验证规则,使我们的程序更加健壮。它可确保我们不要忘记验证东西,以及不经意间让错误的数据存到数据库中。