创建ASP.NET Core MVC应用程序(6)-添加验证

DRY原则

DRY("Don't Repeat Yourself")是MVC的设计原则之一。ASP.NET MVC鼓励你只定义一次功能或行为,然后在应用程序中各处进行使用。这会大大

减少需要编写的代码量,使你的代码不容易出错,更便于测试和维护。

MVC和Entity Framework Core Code First所提供的验证功能是实际应用中DRY原则的一个很好的实例。你可以在一个地方(在模型类中)声明指定的验证规则,在整个应用中生效。

在 User 模型类中添加验证规则

DataAnnotations提供了一组内置的验证特性,你可以应用在任何类或者属性中。(字也包含了类似于DataType这样的格式化特性来帮助你格式化数据而不是提供任何验证功能)

添加内置的Required,StringLength,RegularExpressionRange验证特性。

public class User
{
public int ID { get; set; } [Display(Name = "姓名")]
[StringLength(10, MinimumLength = 3)]
[Required]
public string Name { get; set; } [Display(Name = "邮箱")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; } [Display(Name = "身高")]
[Required]
[Range(150, 230)]
public decimal Height { get; set; } [Display(Name = "职称")]
public string Title { get; set; } [Display(Name = "部门")]
public string Dept { get; set; } [Display(Name = "简介")]
public string Bio { get; set; }
}

其中RequiredMinimumLength Attribute表示属性不能为空;但无法阻止用户输入空格来满足该验证条件。RegularExpression Attribute用来限制用户可以输入的字符。Range Attribute限制值必须在指定的范围内。StringLength Attribute可让你设置字符串的最大长度,和可选的最小长度。值类型(例如decimal,int,float,DateTime)是自身必须的,不需要[Required] Attribute。

验证错误

在输入错误的数据时,jQuery客户端验证马上会发现错误,并显示一个错误信息。注意表单在每个包含无效数据的字段下自动呈现适当的验证错误消息。错误会在客户端(使用JavaScript和jQuery)和服务器端执行。

你会发现你不需要修改UserController类或者Create.cshtml视图中的一行代码,就可以验证UI。之前创建的Controller和视图会自动使用你在User模型类中属性上指定的验证特性规则。使用Edit操作方法测试验证,同样会生效。

在 Create 视图和 Create 动作方法中验证是如何触发的

你可能会好奇在没有对控制器或者视图进行更新的情况下验证UI是如何产生的。

// GET: User/Create
public IActionResult Create()
{
return View();
} // POST: User/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,Name,Email,Bio,Height,Title,Dept")]User user)
{
if (ModelState.IsValid)
{
_context.Add(user);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(user);
}

第一个(HTTP GET)Create方法显示初始的Create表单。第二个([HttpPost])版本负责处理POST请求,通过调用ModelState.IsValid来检查是否有任何验证错误。调用该方法会验证任何已应用到对对象上的验证。如果对象有验证错误,Create方法会重新显示表单。如果没有错误,方法会保存数据到数据库。

在这个例子中,在客户端验证检测到错误时,表单不会POST到服务器,如果你在浏览器中禁用了JS,客户端验证将会禁用,那么HTTP POST Create方法中的ModelState.IsValid会检测任何验证错误。

Input Tag Helper会使用(Consume)DataAnnotations特性并在客户端产生(Produce)jQuery验证所需要的HTML属性。Validation Tag Helper负责显示验证错误。

非常Nice的是这个方案控制器和视图模板不需要知道任何实际执行的验证规则或者具体的错误消息。验证规则和错误字符串只在模型类中指定。同样的骓规则会自动地应用到任何你想要创建或者修改该Model的视图模板。

当你想更改验证逻辑时,你只需要在一个地方给Model添加验证特性。不用担心应用的不同部分执行不同的验证规则 - 所有的验证逻辑在同一个地方定义,在各处使用。这意味着你充分遵循了DRY原则。

使用 DataType Attributes

System.ComponentModel.DataAnnotations命名空间提供了内置的验证特性以外的格式化特性。比如:

[Display(Name = "生日")]
[DataType(DataType.Date)]
public DateTime BirthDate { get; set; } [Range(8000, 10000)]
[DataType(DataType.Currency)]
public decimal Salary { get; set; }

DataType特性只用于视图引擎对数据进行格式化(以及为URL提供<a>标签和为Email提供<a href="mailto:EmailAddress.com">)。你可以使用RegularExpression特性验证数据的格式。DataType特性用于指定比数据库本身类型更为具体的数据类型,它们不是验证特性,这本例中,我们只需要跟踪日期,而不需要具体的时间。

DataType枚举中提供了很多的数据类型,例如Date, Time, PhoneNumber, Currency, EmailAddress等。DataType特性可以让应用自动提供特定数据类型的特征。例如,DataType.EmailAddress可以创建mailto:链接,DataType.Date可以在浏览器提供一个日期选择器。DataType特性会产生HTML 5浏览器所支持的HTML 5 data-属性。DataType不提供任何验证。

DataType.Date不是指定日期的显示格式。默认情况,数据字段默认的显示格式是基于服务器的CultureInfo设置来决定的。

个人博客

我的个人博客

创建ASP.NET Core MVC应用程序(6)-添加验证的更多相关文章

  1. 创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段

    创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段 添加查询功能 本文将实现通过Name查询用户信息. 首先更新GetAll方法以启用查询: public async ...

  2. 创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图

    创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图 创建CRUD动作方法及视图 参照VS自带的基架(Scaffold)系统-MVC Controller with view ...

  3. 创建ASP.NET Core MVC应用程序(1)-添加Controller和View

    创建ASP.NET Core MVC应用程序(1)-添加Controller和View 参考文档:Getting started with ASP.NET Core MVC and Visual St ...

  4. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  5. 创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL

    创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL 用惯.NET的研发人员都习惯性地使用SQLServer作为数据库.然而.NET Core ...

  6. 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

    作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Micro ...

  7. 【翻译】使用Visual Studio创建Asp.Net Core MVC (一)

    This tutorial will teach you the basics of building an ASP.NET Core MVC web app using Visual Studio ...

  8. ASP.NET Core MVC 2.1 顶级参数验证

    本文讨论ASP.NET Core 2.1中与ASP.NET Core MVC / Web API控制器中的模型绑定相关的功能.虽说这是一个功能,但从我的角度来看,它更像是一个错误修复! 请注意,我使用 ...

  9. ASP.NET Core MVC应用程序中的后台工作任务

    在应用程序的内存中缓存常见数据(如查找)可以显着提高您的MVC Web应用程序性能和响应时间.当然,这些数据必须定期刷新. 当然你可以使用任何方法来更新数据,例如Redis中就提供了设定缓存对象的生命 ...

随机推荐

  1. opecv获取图像轮廓

    获取轮廓 #import <opencv2/opencv.hpp> #import <opencv2/imgcodecs/ios.h> #import <opencv2/ ...

  2. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

  3. SQL Server 2000向SQL Server 2008 R2推送数据

    [文章摘要]最近做的一个项目要获取存在于其他服务器的一些数据,为了安全起见,采用由其他“服务器”向我们服务器推送的方式实现.我们服务器使用的是SQL Server 2008 R2,其他“服务器”使用的 ...

  4. ASP.NET Web API标准的“管道式”设计

    ASP.NET Web API的核心框架是一个消息处理管道,这个管道是一组HttpMessageHandler的有序组合.这是一个双工管道,请求消息从一端流入并依次经过所有HttpMessageHan ...

  5. Qt And MFC UI Layout

    界面布局 起初,计算机的交互是通过输入的代码进行的, 慢慢的有了图形之后, 就开始了图形界面的交互. 目前来说还有语音交互, 视频交互等多媒体的交互. 不管哪一种交互, 最终在计算机的角度都是信号的输 ...

  6. Android RatingBar 自定义样式

    Android RatingBar 自定义样式 1.先定义Style: <style name="RadingStyle" parent="@android:sty ...

  7. Kafka随笔一

    一.KafKa所涉及到的名词概念: 1.    Topic:用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. 2.    Partition:是Kafka中横向扩展和一切 ...

  8. WaitType:SOS_SCHEDULER_YIELD

    今天遇到一个query,处于SOS_SCHEDULER_YIELD 状态,physical IO 不增加,CPU的使用一直在增长.当一个sql query长时间处于SOS_SCHEDULER_YIEL ...

  9. Html 特殊符号

    HTML特殊符号对照表 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 Α Α Α Β Β Β Γ Γ Γ Δ Δ Δ Ε Ε Ε Ζ Ζ Ζ Η Η Η Θ Θ Θ Ι Ι Ι Κ ...

  10. Jetstrap 在线构建 Bootstrap 的工具

    Jetstrap 是一个 100% 基于 Web 的 Twitter Bootstrap 构建工具,无需下载软件,只需登录并构建即可.并且别人可以访问你构建的产品.