创建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. ios 关于问题 no matching provisioning profiles found

    ios 关于问题 no matching provisioning profiles found

  2. Windows驱动开发技术详解HelloWDM例子win7下无法安装

    HelloWDM例子编译完成之后,在win7下安装显示 查看setupapi.dev看到如下信息 这个C:\MyDriver_Check目录完全不是我指定的,我放到c盘根目录下 查看inf [Sour ...

  3. MBR结构和DBR结构

  4. Quartz 2D在ios中的使用简述一:坐标体系

    Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境,官方文档:Quartz 2D Programming Guide. 一.坐标体系 这样的坐标体系就导致我们使用Quart ...

  5. 循序渐进做项目系列(4)迷你QQ篇(2)——视频聊天!(附源码)

    一·效果展示 源码派送:MiniQQ1.1 文字聊天的实现参见:循序渐进做项目系列(3):迷你QQ篇(1)——实现客户端互相聊天 二·服务端设计 对于实现视频聊天而言,服务端最核心的工作就是要构造多媒 ...

  6. 迷你MVVM框架 avalonjs 实现上的几个难点

    经过两个星期的性能优化,avalon终于实现在一个页面绑定达到上万个的时候不卡顿的目标(angular的限制是2000).现在稍作休息,总结一下avalon遇到的一些难题. 首先是如何监控的问题.所有 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...

  8. 【Android环境搭建】解决安装使用SDK Manager更新时的问题

    问题描述: 安装使用SDK Manager更新时出现问题 Failed to fetch URL  https://dl-ssl.google.com/android/repository/repos ...

  9. <canvas>设置宽高遇到的问题

    在使用<canvas>元素时必须设置宽度和高度,指定可以绘画的区域大小.但是这里设置宽度和高度的时候有一个小问题. 样例代码: <!DOCTYPE html> <html ...

  10. Jass 技能模型定义(—):半人马酋长的反击光环

      Jass是什么?       先阐释一下什么是jass吧,百度:JASS(正确地说是JASS 2)是魔兽3的程序语言,用于控制游戏和地图的进行,也是魔兽游戏和地图的基础. 地图编辑器中摆放的单位( ...