创建ASP.NET Core MVC应用程序(6)-添加验证
创建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,RegularExpression和Range验证特性。
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; }
}
其中Required和MinimumLength 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)-添加验证的更多相关文章
- 创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段
创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段 添加查询功能 本文将实现通过Name查询用户信息. 首先更新GetAll方法以启用查询: public async ...
- 创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图
创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图 创建CRUD动作方法及视图 参照VS自带的基架(Scaffold)系统-MVC Controller with view ...
- 创建ASP.NET Core MVC应用程序(1)-添加Controller和View
创建ASP.NET Core MVC应用程序(1)-添加Controller和View 参考文档:Getting started with ASP.NET Core MVC and Visual St ...
- 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...
- 创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL
创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL 用惯.NET的研发人员都习惯性地使用SQLServer作为数据库.然而.NET Core ...
- 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)
作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Micro ...
- 【翻译】使用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 ...
- ASP.NET Core MVC 2.1 顶级参数验证
本文讨论ASP.NET Core 2.1中与ASP.NET Core MVC / Web API控制器中的模型绑定相关的功能.虽说这是一个功能,但从我的角度来看,它更像是一个错误修复! 请注意,我使用 ...
- ASP.NET Core MVC应用程序中的后台工作任务
在应用程序的内存中缓存常见数据(如查找)可以显着提高您的MVC Web应用程序性能和响应时间.当然,这些数据必须定期刷新. 当然你可以使用任何方法来更新数据,例如Redis中就提供了设定缓存对象的生命 ...
随机推荐
- nginx 启动不了的小问题
nginx 配置的端口可能没打开 linux打开端口: /sbin/iptables -I INPUT -p tcp --dport 8011 -j ACCEPT #开启8011端口 /etc/ ...
- Android 知识杂记(MVP模式)
MVP的模式在于将原来activity中业务逻辑的部分剥离出来,代码示例如下: Account public class Account { private String mUsername; pri ...
- Kosaraju 算法检测有向图的强连通性
给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strong ...
- iOS开发系列--UITableView全面解析
--UIKit之UITableView 概述 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是U ...
- [.net 面向对象程序设计进阶] (23) 团队开发利器(二)优秀的版本控制工具SVN(上)
[.net 面向对象程序设计进阶] (23) 团队开发利器(二)优秀的版本控制工具SVN(上) 本篇导读: 上篇介绍了常用的代码管理工具VSS,看了一下评论,很多同学深恶痛绝,有的甚至因为公司使用VS ...
- ArcGIS之Cartogram地图变形记
一.地图会说谎 地图作为真实世界的抽象,是“用图说话”最可靠的工具,但是有的时候地图也会撒一些小小的谎言,其中最著名的例子当属美国总统大选.如图1是2012年美国总统大选后网上给出的一个结果图,红色代 ...
- Azure PowerShell (1) PowerShell入门
<Windows Azure Platform 系列文章目录> Update: 2016-01-11 笔者文档主要都是用Azure PowerShell 0.x版本来实现的,比如0.98版 ...
- Sql Server系列:游标
1. 游标简介 游标是一种处理数据的方法,主要用于存储过程.触发器和Transact-SQL脚本中.SELECT语句返回的是一个结果集,游标能够从包含多条数据记录的结果集中每次提取一条记录. 游标的特 ...
- 浅谈requireJS
项目中大都使用模块化开发,requireJS作为AMD模块开发的典范,所以有必要学习下.通过一步步利用requireJS编写demo,从而学习requireJS的一个整体开发流程以及自我使用requi ...
- BFC之宽度自适应布局篇
说到自适应布局,我们曾在“抛砖引玉之宽度自适应布局”一文中学习过.当时的核心思想主要是利用float+margin的形式.利用块状元素的流体特性,然后计算出float元素的宽度,并赋予到块状元素的相应 ...