AspNet MVC4入门指南8给数据模型添加校验器.docx

上传人:b****7 文档编号:11115733 上传时间:2023-02-25 格式:DOCX 页数:12 大小:353.15KB
下载 相关 举报
AspNet MVC4入门指南8给数据模型添加校验器.docx_第1页
第1页 / 共12页
AspNet MVC4入门指南8给数据模型添加校验器.docx_第2页
第2页 / 共12页
AspNet MVC4入门指南8给数据模型添加校验器.docx_第3页
第3页 / 共12页
AspNet MVC4入门指南8给数据模型添加校验器.docx_第4页
第4页 / 共12页
AspNet MVC4入门指南8给数据模型添加校验器.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

AspNet MVC4入门指南8给数据模型添加校验器.docx

《AspNet MVC4入门指南8给数据模型添加校验器.docx》由会员分享,可在线阅读,更多相关《AspNet MVC4入门指南8给数据模型添加校验器.docx(12页珍藏版)》请在冰豆网上搜索。

AspNet MVC4入门指南8给数据模型添加校验器.docx

AspNetMVC4入门指南8给数据模型添加校验器

在本节中将会给Movie模型添加验证逻辑。

并且确保这些验证规则在用户创建或编辑电影时被执行。

保持事情DRY

ASP.NETMVC的核心设计信条之一是DRY:

"不要重复自己(Don’tRepeatYourself)"。

ASP.NETMVC鼓励您指定功能或者行为,只做一次,然后将它应用到应用程序的各个地方。

这可以减少您需要编写的代码量,并减少代码出错率,易于代码维护。

给ASP.NETMVC和EntityFrameworkCodeFirst提供验证支持是DRY信条的一次伟大实践。

您可以在一个地方(模型类)中以声明的方式指定验证规则,这个规则会在应用程序中的任何地方执行。

让我们看看您如何在本电影应用程序中,使用此验证支持。

给电影模型添加验证规则

您将首先向Movie类添加一些验证逻辑。

打开Movie.cs文件。

在文件的顶部添加using语句,从而引用System.ComponentModel.DataAnnotations命名空间:

usingSystem.ComponentModel.DataAnnotations;

注意,该命名空间不包含System.Web。

DataAnnotations提供了一组内置的验证特性,您可以以声明的方式,应用于任何类或属性。

更新Movie类,以利用内置的Required、StringLength和Range验证属性。

以下面的代码为例,以应用验证属性。

publicclassMovie{publicintID{get;set;}[Required]publicstringTitle{get;set;}[DataType(DataType.Date)]publicDateTimeReleaseDate{get;set;}[Required]publicstringGenre{get;set;}[Range(1,100)][DataType(DataType.Currency)]publicdecimalPrice{get;set;}[StringLength(5)]publicstringRating{get;set;}}

运行该应用程序,您会再次得到了以下的运行时错误:

Themodelbackingthe'MovieDBContext'contexthaschangedsincethedatabasewascreated.ConsiderusingCodeFirstMigrationstoupdatethedatabase(

我们将使用Migrations来更新Schema。

生成解决方案,然后打开软件包管理器控制台窗口,并输入以下命令:

add-migrationAddDataAnnotationsMig

update-database

当此命令完后,VisualStudio会打开指定名称(AddDataAnnotationsMig)的文件,其中定义了派生自DbMIgration的新类,并在Up方法中,您可以看到代码更新的Schema和约束条件。

Title和Genre字段不再可以为null(即,您必须输入一个值)并且Rating字段具有最大长度是5。

验证属性将指定一个验证行为,这样您可以指定模型中的那个属性需要被强制验证。

Required属性指示该属性必须有一个值,在此示例中,一部电影必须要有Title、ReleaseDate、Genre和Price属性的值,这样才有效。

Range属性限制了一个指定范围内的值。

StringLength属性允许您设置一个字符串属性的最大长度和其最小长度(可选)。

内部类型(例如decimal,int,float,DateTime)默认是必须的,所以不需要Required属性。

CodeFirst确保您在模型类上所指定的验证规则,会在应用程序修改数据库之前执行。

例如,下面的代码在调用SaveChanges方法时,将引发异常,因为缺失几个必需的Movie属性值,并且价格为零(这在有效范围之外)。

MovieDBContextdb=newMovieDBContext();Moviemovie=newMovie();movie.Title="GonewiththeWind";movie.Price=0.0M;db.Movies.Add(movie);db.SaveChanges();//<=Willthrowserversidevalidationexception

验证规则会自动被.NETFramework执行,这将有助于使您的应用程序更加的可靠。

它还确保你不会因为忘了验证,无意中使得坏的数据也写入到了数据库。

下面是更新后的Movie.cs文件的完整代码清单:

usingSystem;usingSystem.Data.Entity;usingSystem.ComponentModel.DataAnnotations;namespaceMvcMovie.Models{publicclassMovie{publicintID{get;set;}[Required]publicstringTitle{get;set;}[DataType(DataType.Date)]publicDateTimeReleaseDate{get;set;}[Required]publicstringGenre{get;set;}[Range(1,100)][DataType(DataType.Currency)]publicdecimalPrice{get;set;}[StringLength(5)]publicstringRating{get;set;}}publicclassMovieDBContext:

DbContext{publicDbSetMovies{get;set;}}}

ASP.NETMVC的验证错误UI

重新运行应用程序,浏览/Movies的URL。

单击CreateNew链接,来添加一部新电影。

在窗体中填写一些无效值,然后单击Create按钮。

注意,为了使jQuery支持使用逗号的非英语区域的验证,需要设置逗号(",")来表示小数点,你需要引入globalize.js并且你还需要具体的指定cultures/globalize.cultures.js文件(地址在在JavaScript中可以使用Globalize.parseFloat。

下面的代码展示了在"FR-FR"Culture下的Views\Movies\Edit.cshtml视图:

@sectionScripts{@Scripts.Render("~/bundles/jqueryval")}

为了使用这种用户验证界面,真正的好处是,您不需要修改MoviesController类或Create.cshtml视图中的任何一行代码。

在本教程之前所生成的控制器和视图中,Movie模型类的属性上所指定的验证规则一样可以自动适用。

您可能已经注意到了Title和Genre属性,在字段中输入文本或者删除文本,是不会执行所需的验证属性的,直到您提交表单(点Create按钮)时才执行。

对于字段是最初为空(如创建视图中的字段)和只有Required属性并没有其它验证属性的字段,您可以执行以下操作来触发验证:

1.Tabintothefield.

2.Entersometext.

3.Tabout.

4.Tabbackintothefield.

5.Removethetext.

6.Tabout.

上面的顺序将触发必需的验证,而并不需要点击提交按钮。

在不输入任何字段的情况下,直接点击提交按钮,将触发客户端验证。

直到没有客户端验证错误的情况下,表单数据才会发送到服务器。

您可以在服务器端HTTPPost方法上加上断点来测试一下,或者使用Fiddlertool或IE9F12Developertools.

如何验证创建视图和创建方法

您可能很想知道验证用户界面在没有更新控制器或视图代码的情况下是如何生成的。

下面列出了MovieController类中的Create方法。

它们是之前教程中自动生成的,并没有修改。

////GET:

/Movies/CreatepublicActionResultCreate(){returnView();}////POST:

/Movies/Create[HttpPost]publicActionResultCreate(Moviemovie){if(ModelState.IsValid){db.Movies.Add(movie);db.SaveChanges();returnRedirectToAction("Index");}returnView(movie);}

第一种(HTTPGET)Create方法用来显示初始的创建form。

第二个([HttpPost])方法处理form的请求。

第二种Create方法(HttpPost版本)调用ModelState.IsValid来检查是否有的任何的Movie验证错误。

调用此方法将验证对象上所有应用了验证约束的属性。

如果对象含有验证错误,则Create方法会重新显示初始的form。

如果没有任何错误,方法将保存信息到数据库。

在我们的电影示例中,我们使用了验证,当客户端检测到错误时,form不会被post到服务器;所以第二个Create方法永远不会被调用。

如果您在浏览器中禁用了JavaScript,客户端验证也会被禁用,HTTPPOSTCreate方法会调用ModelState.IsValid来检查影片是否含有任何验证错误。

您可以在HttpPostCreate方法中设置一个断点,当客户端验证检测到错误时,不会postform数据,所以永远不会调用该方法。

如果您在浏览器中禁用JavaScript,然后提交具有错误信息的form,断点将会命中。

您仍然得到充分的验证,即使在没有JavaScript的情况下。

下图显示了如何禁用InternetExplorer中的JavaScript。

下图显示了如何在火狐浏览器中禁用JavaScript。

下图显示了如何在Chrome浏览器中禁用JavaScript。

下面是框架代码在之前的教程中生成的Create.cshtml视图模板。

它用来为以上两个操作方法来显示初始的form,同时在验证出错时来重新显示视图。

@modelMvcMovie.Models.Movie@{ViewBag.Title="Create";}

Create

@using(Html.BeginForm()){@Html.ValidationSummary(true)
Movie@Html.LabelFor(model=>model.Title)
@Html.EditorFor(model=>model.Title)@Html.ValidationMessageFor(model=>model.Title)
@Html.LabelFor(model=>model.ReleaseDate)@Html.EditorFor(model=>model.ReleaseDate)@Html.ValidationMessageFor(model=>model.ReleaseDate)@Html.LabelFor(model=>model.Genre)@Html.EditorFor(model=>model.Genre)@Html.ValidationMessageFor(model=>model.Genre)@Html.LabelFor(model=>model.Price)@Html.EditorFor(model=>model.Price)@Html.ValidationMessageFor(model=>model.Price)@Html.LabelFor(model=>model.Rating)@Html.EditorFor(model=>model.Rating)@Html.ValidationMessageFor(model=>model.Rating)

}

@Html.ActionLink("BacktoList","Index")

请注意,代码如何使用Html.EditorForhelper输出为Movie中的每个属性的元素。

此Helper旁边是对Html.ValidationMessageFor方法的调用。

这两个Helper方法将处理由控制器传递到视图的模型对象(在这里是,Movie对象)。

它们会自动查找模型中指定的验证属性,并显示适当的错误消息。

如果您想要在后面更改验证逻辑,您可以做在一个地方,将验证信息添加到模型上。

(此示例中,是movie类)。

您不必担心不符合规则,验证逻辑会在应用程序的不同部分执行——在一个地方定义验证逻辑将会被使用到各个地方。

这使代码非常干净,并使它易于维护和扩展。

它意味着您会完全遵守DRY原则。

给影片模型添加Formatting

打开Movie.cs文件并查看Movie类。

System.ComponentModel.DataAnnotations命名空间提供了内置的验证特性集的格式属性。

我们已经为发布日期和价格字段应用了DataType枚举值。

下面的代码示例了ReleaseDate和Price属性与相应的DisplayFormat属性。

[DataType(DataType.Date)]publicDateTimeReleaseDate{get;set;}[DataType(DataType.Currency)]publicdecimalPrice{get;set;}

DataType属性不是验证特性,它们用来告诉视图引擎如何RenderHTML。

在上面的示例中,DataType.Date属性将影片日期显示为日期,例如,下面的DataType属性不会验证数据的格式:

[DataType(DataType.EmailAddress)]

[DataType(DataType.PhoneNumber)]

[DataType(DataType.Url)]

上面列出的属性只提供视图引擎来显示数据的格式(如:

为URL,

EmailA">为电子邮件。

您可以使用正则表达式属性来验证数据的格式。

另一种使用DataType属性的方式,您可以显式设置DataFormatString。

下面的代码示例了具有一个日期格式字符串的ReleaseDate属性(即"d")。

      [DisplayFormat(DataFormatString="{0:

d}")]

       publicDateTimeReleaseDate{get;set;}

下面的代码设置Price属性为货币格式。

      [DisplayFormat(DataFormatString="{0:

c}")]

       publicdecimalPrice{get;set;}

完整的Movie类如下所示。

publicclassMovie{publicintID{get;set;}[Required]publicstringTitle{get;set;}[DataType(DataType.Date)]publicDateTimeReleaseDate{get;set;}[Required]publicstringGenre{get;set;}[Range(1,100)][DataType(DataType.Currency)]publicdecimalPrice{get;set;}[StringLength(5)]publicstringRating{get;set;}}

运行该应用程序并浏览到Movies控制器。

很好的格式化了发布日期和价格。

下图显示了ReleaseDate和使用"FR-FR"Culture的Price。

下图为默认Culture的显示(EnglishUS)。

在下一部分,我们先会看看代码,然后再改进一下自动生成的Details和Delete方法。

展开阅读全文
相关搜索


copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1