MVC神韵---你想在哪解脱!(十五)
在模型中添加验证规则
本节介绍如何在我们的Movie(电影)模型中添加一些验证规则,同时确认当用户使用我们的应用程序创建或编辑电影信息时将使用这些验证规则对用户输入的信息进行检查。首先,让我们在Movie类中追加一些验证规则。打开Movie.cs文件,在文件的头部追加一条引用System.ComponentModel.DataAnnotations命名空间的using语句,代码如下所示:
using System.ComponentModel.DataAnnotations;
这个System.ComponentModel.DataAnnotations命名空间是.NET Framework中的一个命名空间。它提供了很多内建的验证规则,你可以对任何类或属性显式指定这些验证规则。当然还有些高级属性还要用到System.ComponentModel.DataAnnotations.Schema命名空间。
在Movie类中追加内建的验证规则:
1 public class Movie 2 { 3 public int ID { get; set; } 4 [Required(ErrorMessage = "必须输入标题")] 5 public string Title { get; set; } 6 [Required(ErrorMessage = "必须输入发行日期")] 7 public DateTime ReleaseDate { get; set; } 8 [Required(ErrorMessage = "必须指定种类")] 9 public string Genre { get; set; } 10 [Required(ErrorMessage = "必须输入票价")] 11 [Range(1, 100, ErrorMessage = "票价必须在1元到100元之间")] 12 public decimal Price { get; set; } 13 [StringLength(5,ErrorMessage = "最多允许输入五个字符")] 14 public string Rating { get; set; } 15 }
上述这些验证属性指定了我们想要强加给模型中各属性的验证规则。Required属性表示必填项,必须要指定一个属性值。在上例中,一个有效的电影信息必须含有标题,发行日期,种类与票价信息。Range属性表示属性值必须在一段范围之间。StringLength属性表示一个字符串属性的最大长度或最短长度。EF在将一条数据保存到数据库之前,首先使用你对模型类指定的验证规则来对数据进行有效性验证。例如,在以下代码中,当程序调用SaveChanges方法时将抛出一个异常,因为数据并不满足Movie属性的必须输入条件,同时票价属性的值为0,不在指定的允许范围内(1-100)
1 MovieDBContext db = new MovieDBContext(); 2 Movie movie = new Movie(); 3 movie.Title = "大笑江湖; 4 movie.Price = 0.0M; 5 db.Movies.Add(movie); 6 db.SaveChanges(); // 这里将抛出一个校验异常
通过Entity Framework来自动实现验证规则检查可以让应用程序变得更强健。它也确保我们不会由于忘了实施数据验证而使得一些无效数据保存到数据库中。以下是完整代码:
1 using System.Data.Entity; 2 using System.Data.Entity.ModelConfiguration; 3 using System.ComponentModel.DataAnnotations; 4 namespace MvcMovie.Models 5 { 6 public class Movie 7 { 8 public int ID { get; set; } 9 [Required(ErrorMessage = "必须输入标题")] 10 public string Title { get; set; } 11 [Required(ErrorMessage = "必须输入发行日期")] 12 public DateTime ReleaseDate { get; set; } 13 [Required(ErrorMessage = "必须指定种类")] 14 public string Genre { get; set; } 15 [Required(ErrorMessage = "必须输入票价")] 16 [Range(1, 100, ErrorMessage = "票价必须在1元到100元之间")] 17 public decimal Price { get; set; } 18 [StringLength(5,ErrorMessage = "最多允许输入五个字符")] 19 public string Rating { get; set; } 20 } 21 public class MovieDBContext : DbContext 22 { 23 public DbSet<Movie> Movies { get; set; } 24 protected override void OnModelCreating(ModelBuilder modelBuilder) 25 { 26 modelBuilder.Entity<Movie>().Property(p => 27 p.Price).HasPrecision(18, 2); 28 } 29 } 30 }
现在让我们运行我们的应用程序,并在地址栏中输入“http://localhost:xx/Movies”。在电影清单画面中点击追加按钮打开追加电影画面。在该画面中的表单中填入一些无效的属性值,然后点击追加按钮。如图:
请注意表单自动使用了一个背景颜色来高亮显示包含了无效数据的文本框,并且在每个文本框的旁边显示验证错误信息。使用的错误信息文字正是我们在前面代码中所指定的验证错误的错误信息文字。这个验证错误既可以由客户端引发(JS脚本),也可以由服务器端引发(当用户禁止使用JavaScript脚本时)。这种处理方法是非常不错的,因为我们不再需要为了显示错误信息文字而在MoviesController类或Create.cshtml视图文件中书写不必要的代码。我们之前创建的控制器与视图将自动实施验证规则与显示验证错误信息文字。可以发现MVC中大量应用类似C#特性的属性设置,使开发代码非常简洁干净。在未来的MVC 5中微软为我们又添加了路由属性,这对于MVC开发者来说可是一个福音!