创建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. Hbuilder开发HTML5 APP之WebView

    WebView就是原生的WebView,HBuilder在其上封装了一层,便于Javascript的调用,结构如图: 也可以实现这样的结构: 注意:WebView的使用属性HTML5+规范,所以必须等 ...

  2. Raft 为什么是更易理解的分布式一致性算法

    一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...

  3. .NET面试题系列[15] - LINQ:性能

    .NET面试题系列目录 当你使用LINQ to SQL时,请使用工具(比如LINQPad)查看系统生成的SQL语句,这会帮你发现问题可能发生在何处. 提升性能的小技巧 避免遍历整个序列 当我们仅需要一 ...

  4. .NET面试题系列[11] - IEnumerable<T>的派生类

    “你每次都选择合适的数据结构了吗?” - Jeffery Zhao .NET面试题系列目录 ICollection<T>继承IEnumerable<T>.在其基础上,增加了Ad ...

  5. IE10,11下_doPostBack未定义错误的解决方法

    出现的原因 .NET2.0和.NET4.0一起发布的浏览器定义文件中有一个错误,它们保存相当一部分浏览器版本的定义.但是浏览器的有些版本(比如IE10,11)则不再在这个范围之内.因此,ASP.NET ...

  6. 关于新书《修炼之道:.NET开发要点精讲》的各种说明

    索引 新书介绍 新书封面 新书目录 试读章节 原稿试读 网购地址 规格参数 反馈方式 一些感谢 附加说明 1.新书介绍 从2013年年底到2014年9月,历时将近10个月,这本书终于看到了“出版发行” ...

  7. twobin博客样式—“蓝白之风”

    自暑假以来,囫囵吞枣一般蒙头栽入前端自学中,且不说是否窥探其道,却不自觉中提高了对网页版面设计的要求,乃至挑剔.一个设计清爽美观的网页能让读者心旷神怡,甚至没有了阅读疲劳:而一个设计粗劣嘈杂的网页实在 ...

  8. 开始用Word 2013来写博客

    第一步:如果从未发布过博客文章的话,需要在菜单里面选这里添加博客账号   第二步:选择正确的设置   第三步:写完博客之后,按这里就可以发布了!   如果以后需要写新的博客的话,还可以直接点这里:   ...

  9. WCF basicHttpBinding之Message Security Mode

    原创地址:http://www.cnblogs.com/jfzhu/p/4067873.html 转载请注明出处 前面的文章<WCF Security基本概念>介绍了WCF的securit ...

  10. C语言 · Interval · 求矩阵元素和

    问题描述 这里写问题描述. 输入格式 测试数据的输入一定会满足的格式. 例:输入的第一行包含两个整数n, m,分别表示矩阵的行数和列数.接下来n行,每行m个正整数,表示输入的矩阵. 输出格式 要求用户 ...