手机版

ASP.NET MVC 4简介(8):向数据模型添加校准品

时间:2021-11-04 来源:互联网 编辑:宝哥软件园 浏览:

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

保持干燥。

ASP.NET MVC的核心设计信条之一是DRY:“不要重复你自己”。MVC鼓励您指定一个函数或行为一次,然后将其应用到应用程序的每个部分。这可以减少您需要编写的代码量,降低代码错误率,并使维护代码变得容易。

在ASP.NET为MVC和实体框架代码优先提供验证支持是DRY信条的伟大实践。您可以在一个地方(模型类)以声明方式指定验证规则,并且该规则将在应用程序的任何地方执行。

让我们看看如何在这个电影应用程序中使用这种身份验证支持。

向电影模型添加验证规则。

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

打开Movie.cs文件。在文件顶部添加一个using语句来引用系统。componentmodel.dataannotations命名空间:

使用系统。组件模型。数据注释;

请注意,此命名空间不包含System.Web. DataAnnotations提供了一组内置的验证功能,这些功能可以通过声明方式应用于任何类或属性。

更新电影类,使用内置的必需、字符串长度和范围验证属性。以下面的代码为例,应用验证属性。

公共类Movie { public int ID { get设置;}[必选]公共字符串Title { get设置;} [DataType(数据类型。Date)])公共DateTime ReleaseDate { get设置;}[必需]公共字符串流派{ get设置;}[范围(1,100)][数据类型(DataType。货币)])公共十进制价格{ get设置;} [StringLength(5)]公共字符串评级{ get设置;}}运行应用程序,您将再次得到以下运行时错误:

自数据库创建以来,支持“MovieDBContext”上下文的模型已更改。考虑使用代码优先迁移来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

我们将使用迁移来更新模式。生成解决方案,然后打开程序包管理器控制台窗口,并输入以下命令:

添加-迁移添加数据注释米格更新-数据库

此命令完成后,Visual Studio将打开一个具有指定名称(AddDataAnnotationsMig)的文件,其中定义了一个从DbMIgration派生的新类。在Up方法中,您可以看到代码更新的模式和约束。“标题”和“流派”字段不能再为空(也就是说,您必须输入一个值),并且“评分”字段的最大长度为5。

验证指定验证行为,以便您可以指定模型中的哪个属性需要强制验证。“必需”属性表示该属性必须有值。在本例中,电影必须具有“标题”、“发行日期”、“类型”和“价格”属性的值才能有效。Range属性将值限制在指定的范围内。StringLength属性允许您设置字符串属性的最大长度和最小长度(可选)。默认情况下,内部类型(如十进制、整数、浮点、日期时间)是必需的,因此不需要必需的属性。

代码优先确保在应用程序修改数据库之前执行您在模型类上指定的验证规则。例如,以下代码将在调用SaveChanges方法时引发异常,因为缺少几个必需的Movie属性值,并且价格为零(超出了有效范围)。

MovieDBContext db=new MovieDBContext();电影电影=新电影();电影。Title=《飘》;电影。价格=0.0Mdb。电影.添加(电影);db。saveChanges();//=willthrow服务器端验证异常验证规则将由自动执行。NET框架,这将有助于使您的应用程序更加可靠。它还确保您不会因为忘记验证数据而意外地将错误数据写入数据库。

以下是更新后的Movie.cs文件的完整代码列表:

使用系统;使用系统。数据.实体;使用系统。组件模型。数据注释;命名空间MvcMovie。模型{公共类Movie { public int ID { get设置;}[必选]公共字符串Title { get设置;} [DataType(数据类型。Date)])公共DateTime ReleaseDate { get设置;}[必需]公共字符串流派{ get设置;}[范围(1,100)][数据类型(DataType。货币)])公共十进制价格{ get设置;} [StringLength(5)]公共字符串评级{ get设置;} }公共类MovieDBContext : db context { public DbSetMovie Movies { get;设置;} } }的验证错误UI。net MVC。

再次运行应用程序,并浏览/电影的网址。

单击“新建”链接添加新电影。在表单中填写一些无效值,然后单击“创建”按钮。

请注意,为了让jQuery支持使用逗号验证非英语区域,需要设置逗号(',')来表示小数点,需要引入globalize.js,还需要指定culture/globalize . cultures . js的文件(地址在https://github.com/jQuery/globalize)。Globalize.parseFloat可以在JavaScript中使用。下面的代码显示了“FR-FR”区域性下的视图\电影\编辑. html视图:

@节脚本{ @脚本。render(' ~/bundles/jqueryval ')script src=' http : ~/Scripts/globalize . js '/script script src=' http : ~/Scripts/globalize . culture . fr-fr . js '/script script $ . validator . methods . number=function(value,element){ return this . optional(element)|!isNaN(globalize . parsefloat(value));} $(文档)。ready(function(){ globalize . culture(' FR-FR ');});/script脚本jquery . extend(jquery . validator . methods,{ range: function (value,element,param){//使用Globalization插件解析值var val=$ . global . parsefloat(value);返回this . optional(element)| |(val=param[0]val=param[1]);} });/script}为了使用这个用户身份验证界面,真正的好处是不需要修改MoviesController类或Create.cshtml视图中的任何代码行。在本教程之前生成的控制器和视图中,可以自动应用在电影模型类的属性上指定的验证规则。

您可能已经注意到标题和流派属性。如果您在字段中输入或删除文本,则在您提交表单(单击“创建”按钮)之前,将不会执行所需的验证属性。对于最初为空(例如在视图中创建字段)并且只有“必需”属性而没有其他验证属性的字段,您可以执行以下操作来触发验证:

1.选项卡到字段中。

2.输入一些文本。

3.结帐。

4.将标签放回字段中。

5.删除文本。

6.结帐。

上述顺序将触发必要的验证,而无需单击提交按钮。直接单击提交按钮,不输入任何字段,这将触发客户端身份验证。在没有客户端身份验证错误之前,表单数据不会发送到服务器。可以在服务器端HTTP Post方法中添加断点进行测试,也可以使用Fiddler工具或IE 9 F12开发者工具。

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

您可能想知道如何在不更新控制器或视图代码的情况下生成身份验证用户界面。下面列出了电影控制器类中的创建方法。它们是在上一个教程中自动生成的,没有被修改过。

////GET:/Movies/Createpublic action result Create(){ return View();}////post :/Movies/Create[httpset]public action result Create(Movie Movie){ if(model state。IsValid) { db。电影.添加(电影);db。saveChanges();返回RedirectToAction(' Index ');}返回视图(电影);}第一个(HTTP GET)Create方法用于显示初始创建的表单。第二个([HttpSet])方法处理表单请求。第二个Create方法(HttpPost版本)调用ModelState。检查是否有任何电影验证错误是有效的。调用此方法将验证应用了验证约束的对象的所有属性。如果对象包含验证错误,Create方法将重新显示原始表单。如果没有错误,该方法会将信息保存到数据库中。在我们的电影示例中,我们使用了验证,当客户端检测到错误时,表单不会发布到服务器;所以永远不会调用第二个Create方法。如果在浏览器中禁用JavaScript,客户端身份验证也将被禁用,HTTP POST Create方法将调用ModelState。IsValid检查电影是否包含任何身份验证错误。

您可以在HttpPost Create方法中设置断点。当客户端身份验证检测到错误时,它不会发布表单数据,因此永远不会调用该方法。如果您在浏览器中禁用JavaScript,然后提交一个包含错误消息的表单,断点将会命中。即使没有JavaScript,您仍然得到了充分的验证。下图显示了如何在Internet Explorer中禁用JavaScript。

下图显示了如何在Firefox中禁用JavaScript。

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

以下是由上一教程中的框架代码生成的Create.cshtml视图模板。它用于显示上述两种操作方法的初始表单,并在验证出错时重新显示视图。

注意代码是如何使用Html的。编辑器帮助器为电影中的每个属性输出一个输入元素。这个助手旁边是对Html的调用。方法的验证消息。这些助手方法将处理由控制器传递给视图的模型对象(在本例中是电影对象)。它们会自动找到模型中指定的验证属性,并显示适当的错误消息。

如果以后想更改验证逻辑,可以在一个地方向模型添加验证信息。(在这个例子中,它是电影类。).你不必担心不遵守规则。验证逻辑将在应用程序的不同部分执行。在一个地方定义验证逻辑将在任何地方使用。这使得代码非常干净,并且易于维护和扩展。意味着你会完全遵守DRY原则。

向电影模型添加格式。

打开Movie.cs文件并查看Movie类。命名空间系统。componentmodel.dataannotations提供内置验证功能集的格式属性。我们已经为发布日期和价格字段应用了数据类型枚举值。下面的代码说明了发布日期和价格属性以及相应的显示格式属性。

[数据类型(DataType。Date)])公共DateTime ReleaseDate { get设置;} [DataType(数据类型。货币)])公共十进制价格{ get设置;}

数据类型属性不是验证属性,它们用于告诉视图引擎如何呈现HTML。在上面的例子中,数据类型。Date属性将电影日期显示为日期。例如,以下DataType属性不验证数据的格式:

复制代码如下:[数据类型(datatype . email address)][数据类型(datatype . phone number)][数据类型(datatype.url)]。

上面列出的属性只提供显示数据格式的视图引擎(例如,a是URL,href=' mailto : email address.com '是email)。您可以使用正则表达式属性来验证数据的格式。)

使用数据类型属性的另一种方法是显式设置数据格式字符串。下面的代码示例显示了带有日期格式字符串的“发布日期”属性(即“d”)。

复制代码如下:[display format(data format string=' { 0:d } ')]public datetime release de { get;设置;}

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

复制代码代码如下:[显示格式(数据格式字符串=' { 0: c } ')]公共十进制价格{ get设置;}

完整的电影类如下所示。

@型号MvcMovie .模型。电影@{视图包。标题="创建";} H2 CREAte/H2脚本src=' http : @ URl .内容(' ~/Scripts/jquery。验证。量滴js ')'/script script src=' http : @ URl .内容(' ~/Scripts/jquery。验证。包括。量滴js ')'/script @ using(Html).begin inform()){ @ Html .ValidationSummary(true)字段集legendMovie/legend div class=' editor-label ' @ Html .标签(型号=型号.title)/div class=' editor-field ' @ Html .编辑(模型=模型.标题)@Html .ValidationMessageFor(model=model .title)/div class=' editor-label ' @ Html .标签(型号=型号.发布日期)/div class=' editor-field ' @ Html .编辑(模型=模型.ReleaseDate) @Html .ValidationMessageFor(model=model .发布日期)/div class=' editor-label ' @ Html .标签(型号=型号.流派)/div class=' editor-field ' @ Html .编辑(模型=模型.流派)@Html .ValidationMessageFor(model=model .流派)/div class=' editor-label ' @ Html .标签(型号=型号.price)/div class=' editor-field ' @ Html .编辑(模型=模型.价格)@Html .ValidationMessageFor(model=model .price)/div class=' editor-label ' @ Html .标签(型号=型号.rating)/div class=' editor-field ' @ Html .编辑(模型=模型.评级)@Html .ValidationMessageFor(model=model .评级)/部门p输入类型='提交'值=' Create '/p/field set } div @ Html .操作链接('返回列表','索引)/div运行该应用程序并浏览到电影控制器。很好的格式化了发布日期和价格。下图显示了出厂日期和使用“FR-FR”文化的价格。

下图为默认文化的显示(英语美国).

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

版权声明:ASP.NET MVC 4简介(8):向数据模型添加校准品是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。