首页 > 网站 > 建站经验 > 正文

ASP.NET MVC 5 - 给数据模型-添加校验器

2019-11-02 14:26:13
字体:
来源:转载
供稿:网友

  在本节中将会给Movie模型添加验证逻辑。并且确保这些验证规则在用户创建或编辑电影时被执行。

 拒绝重复 DRYASP.NET MVC 的核心设计信条之一是DRY: "不要重复自己(DRY --Don’t Repeat Yourself)"。ASP.NET MVC鼓励您指定功能或者行为,只做一次,然后将它应用到应用程序的各个地方。这可以减少您需要编写的代码量,并减少代码出错率,易于代码维护。 给ASP.NET MVC 和 Entity Framework Code First 提供验证支持是 DRY 信条的一次伟大实践。您可以在一个地方 (模型类) 中以声明的方式指定验证规则,这个规则会在应用程序中的任何地方执行。 让我们看看您如何在本电影应用程序中,使用此验证支持。 给电影模型添加验证规则您将首先向Movie类添加一些验证逻辑。 打开Movie.cs 文件,注意到System.Web 命名空间并未包含System.ComponentModel.DataAnnotations. DataAnnotations提供了一组内置的严重属性,可供您应用于类、属性。(DataAnnotations也包含一个DataType属性,来帮助格式化的办法来校验) 更新Movie类,以利用内置的Required、 StringLength, RegularExpression和Range验证属性。以下面的代码为例,以应用验证属性。 复制代码public class Movie { public int ID { get; set; } [StringLength(60, MinimumLength = 3)] public string Title { get; set; } [Display(Name = "Release Date")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime ReleaseDate { get; set; } [RegularExpression(@"^[A-Z]+[a-zA-Z''-'s]*$")] [Required] [StringLength(30)] public string Genre { get; set; } [Range(1, 100)] [DataType(DataType.Currency)] public decimal Price { get; set; } [RegularExpression(@"^[A-Z]+[a-zA-Z''-'s]*$")] [StringLength(5)] public string Rating { get; set; } }复制代码  在StringLength属性设置字符串的最大长度,它会在数据库上设置此限制,因此的数据库schema将发生变化。右键单击电影表, 在服务器资源管理器(Server  explorer),然后单击打开表定义(Open Table Definition): clip_image002 在上面的图片中,你可以看到所有的字符串字段被设置为了NVARCHAR  (MAX)数据类型.  我们将使用迁移来更新架构。生成解决方案,然后打开软件包管理器控制台(the Package Manager Console ),输入如下命令: add-migration DataAnno
乐乐影院[www.aikan.tv/special/leleyingyuan/]
tations update-database 当这个命令完成后,Visual Studio将打开类代码文件,它定义了新DbMIgration派生类(DataAnnotations),你可以在Up方法看到更新架构约束代码如下所示: 复制代码public override void Up() { AlterColumn("dbo.Movies", "Title", c => c.String(maxLength: 60)); AlterColumn("dbo.Movies", "Genre", c => c.String(nullable: false, maxLength: 30)); AlterColumn("dbo.Movies", "Rating", c => c.String(maxLength: 5)); }复制代码  该流派(Genre)字段不再可为Null(也就是说,你必须输入一个值)。该评级(Rating)字段最大长度为5, 标题的最大长度为60。标题(Title )和价格 (Price)的范围的最小长度并没有更改。 请在数据库中,检查电影表的schema: clip_image004 该字符串字段显示新的长度限制和流派字段(Genre)不能再为空。 验证属性指明您想要应用到模型属性的行为。Required 和MinimumLength属性指出某一属性不可为空,但没有什么能够阻止用户输入空格来验证。该RegularExpression属性是用来限制哪些字符可以输入。在上面的代码中,流派(Genre)和等级(Rating)只能使用字母(空格,数字和特殊字符是不允许的)。该范围(Range )属性约束的值在一个指定范围内。在StringLength 属性允许您设置一个字符串属性的最大长度,以及最小长度(可选的)。值类型(decimal, int, float, DateTime)有固有必需设置的,不需要的Required属性。 Code First确保你的模型在指定class上在验证规则强制执行之前应用程序将变更储存在数据库中。例如,下面的代码将抛出一个DbEntityValidationException 异常时,调用SaveChanges方法时,因为几个必要的Movie属性缺少: 复制代码MovieDBContext db = new MovieDBContext(); Movie movie = new Movie(); movie.Title = "Gone with the Wind"; db.Movies.Add(movie); db.SaveChanges(); // <= Will throw server side validation exception复制代码  上面的代码会抛出以下异常: Validation failed for one or more entities. 参阅  'EntityValidationErrors' 属性获得更多信息. 具有通过.NET Framework会自动强制执行的验证规则, 有助于使你的应用程序更加健壮。它还确保可以不会忘记验证的东西,即在不经意间不会让坏的数据写入数据库。 ASP.NET MVC 的验证错误UI重新运行应用程序,浏览 /Movies的 URL。 单击Create New链接,来添加一部新电影。在窗体中填写一些无效值,然后单击Create按钮。 如同jQuery的客户端验证来检测到错误时,它会显示一个错误消息。   注意,为了使jQuery支持使用逗号的非英语区域的验证 ,需要设置逗号(",")来表示小数点,如本教程前面所述, 你须引入NuGet globalize。请注意,表单在每一个相应的验证错误消息旁边,已经自动使用红色边框的颜色突出显示文本框指明无效数据。这些错误是强制执行了客户端端(使用JavaScript和jQuery)和服务器端(如果用户禁用了JavaScript)。 一个真正的好处是,你并不需要更改MoviesController类或Create.cshtml视图中的一行代码,来启用此验证的用户界面。您在前面教程所创建的控制器和视图会自动启用,使用验证指明的Movie model类的属性。使用Edit行为方法,同样的验证方法也完全适用。直到没有任何客户端验证错误的表单数据,才会被发送回服务器。您可以通过在HTTP POST方法,用一个断点来验证这一点; 或通过使用fiddler tool,或者IE
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表