WebApi数据验证——编写自定义数据注解(Data Annotations)
2019独角兽企业重金招聘Python工程师标准>>>
配合ModelState使用,关于使用方法,参考微软文档
https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api
自定义Data Annotations只需要继承ValidationAttribute,并且重写IsValid方法。
示例:
// ===================================================================
// ModelState自定义注解
// 多个字段分组判断,全部不允许为空或至少有一个不为空
//====================================================================
// CreateTime:2019-04-24
// Author:liucx
// ===================================================================
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace OF.Component.Model
{/// <summary>/// 多个属性字段分组不为空判断 传入参数逗号间隔/// <example>[GroupEmpty("p1,p2,p3",false,ErrorMessage="p1p2p3三个参数中至少有一个非空")] </example>/// </summary>public class GroupEmptyAttribute : ValidationAttribute{private readonly string _groupFields;private readonly bool _notNullableAll;/// <summary>/// 构造函数/// </summary>/// <param name="groupFields">属性名,多个属性名逗号隔开</param>/// <param name="notNullableAll"> true全部不允许为空。 false只要存在不为空的属性即可</param>public GroupEmptyAttribute(string groupFields, bool notNullableAll){_groupFields = groupFields;_notNullableAll = notNullableAll;}/// <summary>/// 构造函数,默认至少1个非空/// </summary>/// <param name="groupFields">属性名,多个属性名逗号隔开</param>public GroupEmptyAttribute(string groupFields){_groupFields = groupFields;_notNullableAll = false;}protected override ValidationResult IsValid(object value, ValidationContext validationContext){var validateResult = false;var obj = validationContext.ObjectInstance;Type Ts = obj.GetType();var fields = _groupFields.Split(',');if (fields.Count() > 0){for (var i = 0; i < fields.Count(); i++){var filedName = Convert.ToString(fields[i]);if (string.IsNullOrEmpty(filedName)) continue;//valuestring filedValue = Convert.ToString(Ts.GetProperty(filedName).GetValue(obj, null));//_notNullableAll=true,任意一个为空直接验证挂掉跳出循环if (_notNullableAll && string.IsNullOrWhiteSpace(filedValue)){validateResult = false;break;}//_notNullableAll=false,只要有一个不为空就可以过验证if (!_notNullableAll && !string.IsNullOrWhiteSpace(filedValue)){validateResult = true;break;}}}//successif (validateResult)return ValidationResult.Success;else{//failif (string.IsNullOrEmpty(ErrorMessage) && _notNullableAll)return new ValidationResult($"{_groupFields}字段全部不允许为空值");else if (string.IsNullOrEmpty(ErrorMessage) && !_notNullableAll)return new ValidationResult($"{_groupFields}字段中至少要有一个不为空的值");elsereturn new ValidationResult(ErrorMessage);}}}/// <summary>/// 组内数据同步判断,同时为空或同时不为空通过验证/// </summary>public class GroupEmptySyncAttribute : ValidationAttribute{private readonly string _groupFields;public GroupEmptySyncAttribute(string groupFields){_groupFields = groupFields;}protected override ValidationResult IsValid(object value, ValidationContext validationContext){var validateResult = true;var obj = validationContext.ObjectInstance;Type Ts = obj.GetType();var fields = _groupFields.Split(',');if (fields.Count() > 0){bool firstValueIsEmpty = true;//第一个值是否为空for (var i = 0; i < fields.Count(); i++){var filedName = Convert.ToString(fields[i]);if (string.IsNullOrEmpty(filedName)) continue;//valuestring filedValue = Convert.ToString(Ts.GetProperty(filedName).GetValue(obj, null));//第一个值记录是否为空if (i == 0 && string.IsNullOrWhiteSpace(filedValue))firstValueIsEmpty = true;if (i == 0 && !string.IsNullOrWhiteSpace(filedValue))firstValueIsEmpty = false;//后续值判断是否和第一个值符合,不符合直接结束验证if (i > 0){if (string.IsNullOrWhiteSpace(filedValue) != firstValueIsEmpty){validateResult = false;break;}}}}//successif (validateResult)return ValidationResult.Success;else{//failif (string.IsNullOrEmpty(ErrorMessage))return new ValidationResult($"{_groupFields}字段是否为空不一致(必须同时为空或同时不为空)");elsereturn new ValidationResult(ErrorMessage);}}}/// <summary>/// 判断时间格式是否对应,时间格式一致通过验证/// </summary>public class DateFormatValidAttribute : ValidationAttribute{private readonly string _formatStr;public DateFormatValidAttribute(string formatStr){_formatStr = formatStr;}protected override ValidationResult IsValid(object value, ValidationContext validationContext){var validateResult = false;try{//转成要求的格式后 再和传入的值对比var formatValue = Convert.ToDateTime((string)value).ToString(_formatStr);if ((string)value == formatValue)validateResult = true;elsevalidateResult = false;//successif (validateResult)return ValidationResult.Success;else{//failif (string.IsNullOrEmpty(ErrorMessage))return new ValidationResult($"时间格式不符合{_formatStr}格式");elsereturn new ValidationResult(ErrorMessage);}}catch (Exception ex){if (string.IsNullOrEmpty(ErrorMessage))return new ValidationResult($"时间格式不符合{_formatStr}格式");elsereturn new ValidationResult(ErrorMessage);}}}
}
使用:
测试结果:
转载于:https://my.oschina.net/CrazyBoy1024/blog/3042984
WebApi数据验证——编写自定义数据注解(Data Annotations)相关推荐
- SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——SpringMVC
7.4.数据验证 7.4.1.编程式数据验证 Spring 2.x提供了编程式验证支持,详见[4.16.2 数据验证]章节,在此我们重写[4.16.2.4.1.编程式验证器]一节示例. (1.验证器实 ...
- element手机验证格式_Excel数据验证:给数据把个关,工作效率有保障。
马上就是年中了,不少同学都已经步入紧张而繁忙的工作中,突然间有点不适应,但是大家都在自我调整.这不,早上一到办公室我就听见我旁边的同事在"慷慨陈词":因为同事需要做一份公司员工的信 ...
- java 注解校验_Java开发编写自定义校验注解和校验器
自定义校验 1).编写一个自定义的校验注解 2).编写一个自定义的校验器 ConstraintValidator 3).关联自定义的校验器和自定义的校验注解 * @Documented * @Cons ...
- Excel中7种自定义数据验证设置
在Excel中,利用数据验证可以对数据的录入添加一定的限制条件.比如我们可以通过数据验证的基本设置使单元格只能录入整数.小数.时间.日期等,也可以创建下拉菜单选项.数据验证的基本功能在前面的文章已进行 ...
- Spring MVC数据验证
文章目录 客户端验证 服务器端验证 自定义 Spring 验证器 Validator接口 ValidationUtils 类 Spring MVC验证器应用实例 JSR 303 验证 Hibernat ...
- Silverlight – Datagrid,Dataform数据验证和ValidationSummary
上一篇,我们讨论了,捕获用户提交数据验证.本篇将集中讨论Datagrid和Dataform两个数据控件的数据验证方法,其中,我们会附加介绍一个新的验证控件ValidationSummary. 概述 D ...
- Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary
上一篇,我们讨论了,捕获用户提交数据验证.本篇将集中讨论Datagrid和Dataform两个数据控件的数据验证方法,其中,我们会附加介绍一个新的验证控件ValidationSummary. 概述 D ...
- excel导入数据校验_Excel数据验证错误消息
excel导入数据校验 Do you like to use error checking in Excel, so that problem cells are flagged, or do you ...
- 数据验证html,JavaScript 表单数据验证
JavaScript 表单 HTML 表单验证可以通过 JavaScript 来完成. HTML 表单验证也可以通过浏览器来自动完成. 如果表单字段 (fname) 的值为空, required 属性 ...
最新文章
- 【转载】OSPF网络类型
- nboot通过DNW下载并运行eboot.nb0
- APICloud中app如何在手机端测试
- 把html变成桌面的软件,5 分钟把任意网站变成桌面软件
- 技术实践:大规模知识图谱预训练及电商应用
- http调用如何返回回调函数_Simulink(模型amp;函数调用发生模块)+Guide自写简单系统(五)+StateflowChart回调函数 (二)...
- 使用java反射写一个通用的jdbc查询
- mysql数据库视图_MySQL数据库8(二十)视图
- JS包含js文件 动态添加css
- Java入门电子书百度网盘下载,附面试答案
- Extjs日期控件选择计算日期差值
- win10计算机不显示usb,win10插入U盘不显示怎么办_解决win10u盘插电脑上不显示的办法...
- 制订项目进度计划的讨论
- python 安装scapy_安装scapy时出错
- Windows Server 2008安装配置IIS
- 什么是前端渲染和后端渲染和SPA页面
- android+蓝牙+文件传输,蓝牙文件传输Android
- java代码json_JSON 解析(java代码)
- 网站注册邮件发送功能实现
- nginx反向代理去除目录层级转发