一. 简介

  写完上一个章节MVC中的常用特性,迫不及待将该系列补全,该章节主要介绍数据批注(也叫:注解)。

  一听【数据批注】,好高大上的名字,但仔细一看,它们其实是【System.ComponentModel.DataAnnotations】程序集下的一些特性类,O(∩_∩)O哈哈~,既然是特性,就符合特性的所有特征,只不过这些特性是作用于“属性”上的。

  再一看【System.ComponentModel.DataAnnotations】这个命名空间,有点眼熟,与之前EF中的一篇文章【EF的CodeFirst模式通过DataAnnotations修改默认协定】中的一类操作来源于同一个命名空间下。

  所以综上所述:该命名空间下的特性,在EF中可以用来映射生成数据库中的表字段,在日常开发中也可以用于做类中属性的限制和验证。

原理:均继承了ValidationAttribute特性,通过覆写IsValide方法进行校验。

适用场景:很多项目需要客户端和服务器端进行双重格式验证,使之更加安全,这时服务器端就可以使用数据批注了来进行校验了。

以Required特性为例,查看一下源码:

二. 常用的数据批注

这里总结一下【System.ComponentModel.DataAnnotations】命名空间下常用的数据批注,即特性。

① Key :声明主键

② Required:非空声明

③ MinLength和MaxLength:设置string类型的最大长度和最小长度,数据库的对应nvarchar

④ StringLength:设置string类型的长度,数据库对应nvarchar

⑤ Compare:新老密码对比

⑥ RegularExpression:正则的匹配

⑦ Phone:验证手机号码

⑧ Range:验证范围

⑨ Timestamp:将byte[]类型设置为timestamp类型

⑩ ConcurrencyCheck:并发检查,执行update操作时,会检查并发性(乐观锁)   (在后面并发章节着重介绍Timestamp和ConcurrencyCheck)

另外还有一些不是很常用的,如:

① DisplayName:声明属性的名称

② Remote:远程验证,需要JQuery插件的支持  (这里不做测试等待补充  参考: https://www.cnblogs.com/JustRun1983/p/3505151.html)

下面补充一下该命名空间反射源码,可以自行查找需要的批注:

代码测试: 

(1). 实体类,在其属性上添加数据标注

     /// <summary>
/// 用户信息类 ,用于测试框架本身提供的数据批注
/// </summary>
public class UserInfor
{
[Required]
public string id { get; set; } [StringLength()]
public string userName { get; set; } [MaxLength()]
public string userMsg { get; set; } [Range(, )]
public int userAge { get; set; } [RegularExpression("[a-d]")] //a-d中的一个
public string userMsg3 { get; set; } [Phone]
public string userPhone { get; set; } public string userOldPwd { get; set; } [Compare("userOldPwd")] //比较和userOldPwd的值是否相等
public string userNewPwd { get; set; } }

(2). 前端代码

            //1. 测试数据批注
$("#btn1").click(function () {
$.ajax({
type: "Post",
url: "TestDataAnnotationModel",
data: {
"id":"123",
"userName": "mr12",
"userMsg": "ypf1234",
"userAge": 6,
"userMsg3": "a",
"userPhone": "15764222366",
"userOldPwd": "123456",
"userNewPwd":"123456" },
success: function (data) {
if (data == "ok") {
alert("测试通过");
}
if (data == "error") {
alert("测试未通过");
}
}
});
});

(3). 服务器端代码

   public ActionResult TestDataAnnotationModel(UserInfor user)
{
//通过该方法进行验证
var isValidate = ModelState.IsValid; if (isValidate)
{
return Content("ok");
}
return Content("error");
}

三. 自定义数据批注

思路:通过上面的批注源码可知,均为自定义类继承:ValidationAttribute,覆写IsValid方法

需求:这里我们自定义一个批注,要求不为空,且长度区间为6-12位

使用方法同样为:action中通过实体接收,通过ModelState.IsValid的值为true或false来判断验证是否通过

代码测试:

(1). 实体类和自定义批注

     /// <summary>
/// 角色类,用于测试自定义业务的数据批注
/// </summary>
public class RoleInfor
{ public string id { get; set; } [myOwnCheck]
public string roleName { get; set; }
} /// <summary>
/// 自定义数据批注,要求非空且长度为6-12位
/// </summary>
public class myOwnCheckAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value != null && value.ToString().Length > && value.ToString().Length < )
{
return true;
}
return false;
}
}

(2). 前端代码

            //2. 测试自定义业务逻辑的验证
$("#btn2").click(function () {
$.ajax({
type: "Post",
url: "TestMyOwnCheck",
data: {
"id": "",
"roleName": "mr12345"
},
success: function (data) {
if (data == "ok") {
alert("测试通过");
}
if (data == "error") {
alert("测试未通过");
}
}
});
});

(3). 服务器端代码

    public ActionResult TestDataAnnotationModel(UserInfor user)
{
//通过该方法进行验证
var isValidate = ModelState.IsValid; if (isValidate)
{
return Content("ok");
}
return Content("error");
}

四. Model级别的验证扩展

  实现IValidaableObjec接口,实现Validate方法。(了解即可)

  public class CarInfor: IValidatableObject
{
public string id { get; set; } public string carName { get; set; } public int carAge { get; set; } IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
{
if (carAge % == )
{
var result = new ValidationResult("车龄验证不通过", new string[] { "carAge" }); yield return result;
}
}
}

第十节:数据批注(DataAnnotationModel)和自定义验证(包括Model级别的验证)的更多相关文章

  1. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  2. centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课

    centos   shell编程6一些工作中实践脚本   nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志  直接送给bc做计算  gzip  innobacku ...

  3. 第三百一十四节,Django框架,自定义分页

    第三百一十四节,Django框架,自定义分页 自定义分页模块 #!/usr/bin/env python #coding:utf-8 from django.utils.safestring impo ...

  4. CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第十节

    原文链接 第十节:CUDPP, 强大的数据平行CUDA库Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在多 ...

  5. 第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理

    第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理 将一个app下的models数据库表注册到xadmin后台管理 重点 ...

  6. 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

    第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time ...

  7. 第三百一十节,Django框架,模板语言

    第三百一十节,Django框架,模板语言 模板语言就是可以将动态数据在html模板渲染的语言 一.接收值渲染 locals()函数,写在请求响应render()函数里,可以将逻辑处理函数里的变量传到h ...

  8. centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 访问控制 apache rewrite 配置开机启动apache tcpdump 第二十节课

    centos    LAMP第二部分apache配置  下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转  配置apache的访问日志  配置静态文件缓存  配置防盗链 ...

  9. 第十节:详细讲解一下Java多线程,随机文件

    前言 大家好,给大家带来第十节:详细讲解一下Java多线程,随机文件的概述,希望你们喜欢 多线程的概念 线程的生命周期 多线程程序的设计 多线程的概念 多线程的概念:程序是静态的,进程是动态的.多进程 ...

随机推荐

  1. Elixir 分布式平台

    概述 分布式平台的核心在于并发,容错. 而 Elixir 的优势正是在于对于并发和容错的处理. 分布式模型 CSP(Communicating Sequential Process) 模型 :: 多个 ...

  2. 怎样保证socket.recv接收完数据

    最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...

  3. Managing Large State in Apache Flink®: An Intro to Incremental Checkpointing

    January 23, 2018- Apache Flink, Flink Features Stefan Richter and Chris Ward Apache Flink was purpos ...

  4. uWSGI、WSGI和uwsgi

    WSGI wsgi server (比如uWSGI) 要和 wsgi application(比如django )交互,uwsgi需要将过来的请求转给django 处理,那么uWSGI 和 djang ...

  5. php curl cookie 读写

    普通 curl post 请求 public static function curlPost($url, $post_fields = array(), $timeout = 5) { $timeo ...

  6. svn 钩子应用 - svn 提交字符限制, 不能为空

    一.版本库钩子 1.1 start-commit  开始提交的通知 输入参数:传递给你钩子程序的命令行参数,顺序如下: 1.  版本库路径 2.  认证过的尝试提交的用户名 3.  Depth,mer ...

  7. Oracle Data Provider for .Net classes文档

    官方文档详见:https://docs.oracle.com/en/database/oracle/oracle-data-access-components/18.3/odpnt/odp-dot-n ...

  8. Cnario 3.8支持哪些操作系统?

    Cnario是基于Windows平台开发的软件,包含Server.Messenger和Player三个组件,支持以下Windows 版本系统: Server/Messenger 支持英文版的以下操作系 ...

  9. python之路3-元组、列表、字典、集合

    1.元组 特点:一旦创建,内容不可修改,又叫只读列表 a= ('wang','zhang','zhao') print(a.count('zhao')) print(a.index('wang')) ...

  10. poj3436(拆点最大流)

    题意:给你p和n,p代表每台计算器需要几个部分组成,n代表有几个组装机器,接下来n行,每行第一个数代表这台机器能够每小时组装几台,剩下前三个数字表示使用这台机器需要的前置条件(0代表当前组装不能有这个 ...