ASP.NET MVC3 快速入门-第八节 在模型中添加验证规则

转载 2013年12月03日 17:41:57

第八节 在模型中添加验证规则

本节介绍如何在我们的Movie(电影)模型中添加一些验证规则,同时确认当用户使用我们的应用程序创建或编辑电影信息时将使用这些验证规则对用户输入的信息进行检查。

8.1 DRY原则

在ASP.NET MVC中,有一条作为核心的原则,就是DRY(“Don’t Repeat Yourself,中文意思为:不要让开发者重复做同样的事情)原则。ASP.NET MVC提倡让开发者“一处定义、处处可用”。这样可以减少开发者的代码编写量,同时也更加便于代码的维护。

ASP.NET MVC与EF code-first提供的默认验证规则就是一个实现DRY原则的很好的例子。你也可以在模型类中显式地追加一个验证规则,然后在整个应用程序中都使用这个验证规则。

现在让我们来看一下怎样在我们的应用程序中追加一些验证规则。

8.2 在Movie模型中追加验证规则

首先,让我们在Movie类中追加一些验证规则。

打开Movie.cs文件,在文件的头部追加一条引用System.ComponentModel.DataAnnotations命名空间的using语句,代码如下所示。

using System.ComponentModel.DataAnnotations;

这个System.ComponentModel.DataAnnotations命名空间是.NET Framework中的一个命名空间。它提供了很多内建的验证规则,你可以对任何类或属性显式指定这些验证规则。

现在让我们来修改Movie类,增加一些内建的Required(必须输入),StringLength(输入字符长度)与Range(输入范围)验证规则,代码如代码清单8-1所示。

代码清单8-1 在Movie类中追加内建的验证规则

public class Movie

{

public int ID { get; set; }

[Required(ErrorMessage = "必须输入标题")]

public string Title { get; set; }

[Required(ErrorMessage = "必须输入发行日期")]

public DateTime ReleaseDate { get; set; }

[Required(ErrorMessage = "必须指定种类")]

public string Genre { get; set; }

[Required(ErrorMessage = "必须输入票价")]

[Range(1, 100, ErrorMessage = "票价必须在1元到100元之间")]

public decimal Price { get; set; }

[StringLength(5,ErrorMessage = "最多允许输入五个字符")]

public string Rating { get; set; }

}

上述这些验证属性指定了我们想要强加给模型中各属性的验证规则。Required属性表示必须要指定一个属性值,在上例中,一个有效的电影信息必须含有标题,发行日期,种类与票价信息。Range属性表示属性值必须在一段范围之间。StringLength属性表示一个字符串属性的最大长度或最短长度。

EF code-first在将一条数据保存到数据库中之前首先使用你对模型类指定的验证规则来对这条数据进行有效性检查。例如,在以下代码中,当程序调用SaveChanges方法时将抛出一个异常(也称例外),因为数据并不满足Movie属性的必须输入条件,同时票价属性的值为0,不在指定的允许范围内(1-100)。

MovieDBContext db = new MovieDBContext();

Movie movie = new Movie();

movie.Title = "大笑江湖;

movie.Price = 0.0M;

db.Movies.Add(movie);

db.SaveChanges(); // 这里将抛出一个校验异常

通过Entity Framework来自动实现验证规则检查可以让我们的应用程序变得更强健。它也确保我们不会由于忘了实施数据验证而使得一些无效数据保存到数据库中。

代码清单8-2为现在Movie.cs文件中的完整代码。

代码清单8-2 Movie.cs文件中的完整代码

using System.Data.Entity;

using System.Data.Entity.ModelConfiguration;

using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models

{

public class Movie

{

public int ID { get; set; }

[Required(ErrorMessage = "必须输入标题")]

public string Title { get; set; }

[Required(ErrorMessage = "必须输入发行日期")]

public DateTime ReleaseDate { get; set; }

[Required(ErrorMessage = "必须指定种类")]

public string Genre { get; set; }

[Required(ErrorMessage = "必须输入票价")]

[Range(1, 100, ErrorMessage = "票价必须在1元到100元之间")]

public decimal Price { get; set; }

[StringLength(5,ErrorMessage = "最多允许输入五个字符")]

public string Rating { get; set; }

}

public class MovieDBContext : DbContext

{

public DbSet<Movie> Movies { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity<Movie>().Property(p =>

p.Price).HasPrecision(18, 2);

}

}

}

8.3 ASP.NET MVC中的验证错误UI(用户界面)

现在让我们运行我们的应用程序,并在地址栏中输入“http://localhost:xx/Movies”。

在电影清单画面中点击追加按钮打开追加电影画面。在该画面中的表单中填入一些无效的属性值,然后点击追加按钮。如图8-1所示。

ASP.NET <wbr>MVC3 <wbr>快速入门-第八节 <wbr>在模型中添加验证规则

图8-1 ASP.NET MVC中的验证错误UI

请注意表单自动使用了一个背景颜色来高亮显示包含了无效数据的文本框,并且在每个文本框的旁边显示验证错误信息。使用的错误信息文字正是我们在前面代码中所指定的验证错误的错误信息文字。这个验证错误既可以由客户端引发(使用JavaScript脚本),也可以由服务器端引发(当用户禁止使用JavaScript脚本时)。

这种处理方法是非常不错的,因为我们不再需要为了显示错误信息文字而在MoviesController类或Create.cshtml视图文件中书写不必要的代码。我们之前创建的控制器与视图将自动实施验证规则与显示验证错误信息文字。

8.4 在Create视图(追加电影视图)与Create方法内部是如何实现验证的

也许有的读者会问,既然我们没有追加任何显示错误信息提示的代码,那么我们的控制器或视图内部是如何生成这个显示错误信息提示的画面的。首先我们将MovieController类中的代码显示如下,在我们在Movie类中追加了验证规则后,我们并没有修改这个类中的任何代码。

//

// GET: /Movies/Create

public ActionResult Create()

{

return View();

}

//

// POST: /Movies/Create

[HttpPost]

public ActionResult Create(Movie newMovie)

{

if (ModelState.IsValid)

{

db.Movies.Add(newMovie);

db.SaveChanges();

return RedirectToAction("Index");

}

else

{

return View(newMovie);

}

}

第一个方法返回追加电影视图。在第二个方法中对追加电影视图中的表单的提交进行处理。该方法中的ModelState.IsValid属性用来判断是否提交的电影数据中包含有任何没有通过数据验证的无效数据。如果存在无效数据,Create方法重新返回追加电影视图。如果数据全部有效,则将该条数据保存到数据库中。

我们之前创建的使用支架模板的Create.cshtml视图模板中的代码显示如下,在首次打开追加电影视图与数据没有通过验证时,Create方法中返回的视图都是使用的这个视图模板。

@model MvcMovie.Models.Movie

@{

ViewBag.Title = "追加电影信息";

}

<h2>追加电影信息</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"

type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"

type="text/javascript"></script>

@using (Html.BeginForm()) {

@Html.ValidationSummary(true)

<fieldset>

<legend>电影</legend>

<div class="editor-label">

标题

</div>

<div class="editor-field">

@Html.EditorFor(model => model.Title)

@Html.ValidationMessageFor(model => model.Title)

</div>

<div class="editor-label">

发行日期

</div>

<div class="editor-field">

@Html.EditorFor(model => model.ReleaseDate)

@Html.ValidationMessageFor(model => model.ReleaseDate)

</div>

<div class="editor-label">

种类

</div>

<div class="editor-field">

@Html.EditorFor(model => model.Genre)

@Html.ValidationMessageFor(model => model.Genre)

</div>

<div class="editor-label">

票价

</div>

<div class="editor-field">

@Html.EditorFor(model => model.Price)

@Html.ValidationMessageFor(model => model.Price)

</div>

<p>

<input type="submit" value="追加" />

</p>

</fieldset>

}

<div>

@Html.ActionLink("返回电影列表", "Index")

</div>

请注意在这段代码中使用了许多Html.EditorFor帮助器来为Movie类的每个属性输出一个输入文本框。在每个Html.EditorFor帮助器之后紧跟着一个Html.ValidationMessageFor帮助器。这两个帮助器将与从控制器传入的模型类的对象实例(在本示例中为Movie对象的一个实例)结合起来,自动寻找指定给模型的各个验证属性,然后显示对应的验证错误信息。

这种验证体制的好处是在于控制器和Create视图(追加电影视图)事先都即不知道实际指定的验证规则,也不知道将会显示什么验证错误信息。验证规则和错误信息只在Movie类中被指定。

如果我们之后想要改变验证规则,我们也只要在一处地方进行改变就可以了。我们不用担心整个应用程序中存在验证规则不统一的问题,所有的验证规则都可以集中在一处地方进行指定,然后在整个应用程序中使用这些验证规则。这将使我们的代码更加清晰明确,更加具有可读性、可维护性与可移植性。这将意味着我们的代码是真正符合DRY原则(一处指定,到处可用)的。

在下一节中,作为结尾部分,我们将介绍如何修改与删除数据,同时介绍如何显示一条数据的细节信息。

ASP.NET MVC3 高级编程学习笔记——入门

最早就接触过asp.net mvc 框架了,从1.0开始到现在的4.0,感觉是时候拥抱mvc了。 本篇主要内容 Model—View—Controller介绍ViewModel模式ASP.NE...
  • langal1212
  • langal1212
  • 2013年09月23日 14:02
  • 618

在ASP.NET MVC3 中利用JSONP跨域登录WEB系统(加强版)

本文为 在ASP.NET MVC3 中利用JSONP跨域登录WEB系统 这篇文章的改进版。在上文中首先感谢园友们的热心讨论。本文将对跨域登录进行一改进,改进内容如下:      跨域登录后不同系...
  • linybo
  • linybo
  • 2015年05月13日 10:18
  • 547

ASP.NET MVC3 快速入门-第四节 添加一个模型

第四节 添加一个模型 在本节中我们将追加一些类来管理数据库中的电影。这些类将成为我们的MVC应用程序中的“模型”部分。 我们将使用一个.NET Framework的被称之为“Entity Fram...
  • u013017201
  • u013017201
  • 2013年12月03日 09:27
  • 422

ASP.NET MVC3快速入门——第四节、添加一个模型

在本节中我们将追加一些类来管理数据库中的电影。这些类将成为我们的MVC应用程序中的“模型”部分。 我们将使用一个.NET Framework的被称之为“Entiry Framework”的数据访问技...
  • ahao214
  • ahao214
  • 2013年07月24日 19:42
  • 589

MVC3 自带数据验证

===========一、基础============= 对于web开发人员来说,对用户输入的信息进行验证是一个重要但是繁琐的工作,而且很多开发者都会忽略。asp.net mvc3框架使用的...
  • cqkxzyi
  • cqkxzyi
  • 2015年05月17日 18:05
  • 950

asp.net mvc3 的数据验证(一)

asp.net mvc3 的数据验证(一)      对于web开发人员来说,对用户输入的信息进行验证是一个重要但是繁琐的工作,而且很多开发者都会忽略。asp.net mvc3框架使...
  • jsjpanxiaoyu
  • jsjpanxiaoyu
  • 2015年08月23日 23:43
  • 362

Asp.Net MVC3 简单入门详解过滤器Filter(身份验证、缓存、防盗链、国际化等)

前言在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MVC(特指:Asp.Net MVC,以下皆同)项目中不想让MVC开发人员去关心和写类似身份验证,日志,异常,行为截取等这部分重复的代码,...
  • sven_xu
  • sven_xu
  • 2015年06月02日 09:24
  • 786

asp.net mvc3 的数据验证(一)

对于web开发人员来说,对用户输入的信息进行验证是一个重要但是繁琐的工作,而且很多开发者都会忽略。asp.net mvc3框架使用的是叫做“数据注解”(DataAnnotations)的方式进行数据验...
  • Adensky
  • Adensky
  • 2014年05月18日 13:12
  • 915

ASP.NET MVC4 入门(九)——为模型添加验证

本节你将为Movie类型增加逻辑验证,以确保任何用户试图使用该应用程序创建或编辑影片时执行验证规则。 DRY(干爽) ASP.NET MVC的核心原则之一是干爽(“不要自己重复”)。ASP...
  • zhangemails
  • zhangemails
  • 2014年07月05日 14:52
  • 447

ASP.NET MVC3 入门指南之数据验证

无论你编写什么样的网页程序,都需要对用户的数据进行验证,以确数据的有效性和完整性。 ASP.NET MVC3允许你采用一种被称之为“数据注释”的方式来进行数据验证,这种验证包含了客户端浏览器 和服...
  • bear_79
  • bear_79
  • 2014年01月24日 10:58
  • 428
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET MVC3 快速入门-第八节 在模型中添加验证规则
举报原因:
原因补充:

(最多只允许输入30个字)