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)相关推荐

  1. SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——SpringMVC

    7.4.数据验证 7.4.1.编程式数据验证 Spring 2.x提供了编程式验证支持,详见[4.16.2 数据验证]章节,在此我们重写[4.16.2.4.1.编程式验证器]一节示例. (1.验证器实 ...

  2. element手机验证格式_Excel数据验证:给数据把个关,工作效率有保障。

    马上就是年中了,不少同学都已经步入紧张而繁忙的工作中,突然间有点不适应,但是大家都在自我调整.这不,早上一到办公室我就听见我旁边的同事在"慷慨陈词":因为同事需要做一份公司员工的信 ...

  3. java 注解校验_Java开发编写自定义校验注解和校验器

    自定义校验 1).编写一个自定义的校验注解 2).编写一个自定义的校验器 ConstraintValidator 3).关联自定义的校验器和自定义的校验注解 * @Documented * @Cons ...

  4. Excel中7种自定义数据验证设置

    在Excel中,利用数据验证可以对数据的录入添加一定的限制条件.比如我们可以通过数据验证的基本设置使单元格只能录入整数.小数.时间.日期等,也可以创建下拉菜单选项.数据验证的基本功能在前面的文章已进行 ...

  5. Spring MVC数据验证

    文章目录 客户端验证 服务器端验证 自定义 Spring 验证器 Validator接口 ValidationUtils 类 Spring MVC验证器应用实例 JSR 303 验证 Hibernat ...

  6. Silverlight – Datagrid,Dataform数据验证和ValidationSummary

    上一篇,我们讨论了,捕获用户提交数据验证.本篇将集中讨论Datagrid和Dataform两个数据控件的数据验证方法,其中,我们会附加介绍一个新的验证控件ValidationSummary. 概述 D ...

  7. Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary

    上一篇,我们讨论了,捕获用户提交数据验证.本篇将集中讨论Datagrid和Dataform两个数据控件的数据验证方法,其中,我们会附加介绍一个新的验证控件ValidationSummary. 概述 D ...

  8. excel导入数据校验_Excel数据验证错误消息

    excel导入数据校验 Do you like to use error checking in Excel, so that problem cells are flagged, or do you ...

  9. 数据验证html,JavaScript 表单数据验证

    JavaScript 表单 HTML 表单验证可以通过 JavaScript 来完成. HTML 表单验证也可以通过浏览器来自动完成. 如果表单字段 (fname) 的值为空, required 属性 ...

最新文章

  1. 【转载】OSPF网络类型
  2. nboot通过DNW下载并运行eboot.nb0
  3. APICloud中app如何在手机端测试
  4. 把html变成桌面的软件,5 分钟把任意网站变成桌面软件
  5. 技术实践:大规模知识图谱预训练及电商应用
  6. http调用如何返回回调函数_Simulink(模型amp;函数调用发生模块)+Guide自写简单系统(五)+StateflowChart回调函数 (二)...
  7. 使用java反射写一个通用的jdbc查询
  8. mysql数据库视图_MySQL数据库8(二十)视图
  9. JS包含js文件 动态添加css
  10. Java入门电子书百度网盘下载,附面试答案
  11. Extjs日期控件选择计算日期差值
  12. win10计算机不显示usb,win10插入U盘不显示怎么办_解决win10u盘插电脑上不显示的办法...
  13. 制订项目进度计划的讨论
  14. python 安装scapy_安装scapy时出错
  15. Windows Server 2008安装配置IIS
  16. 什么是前端渲染和后端渲染和SPA页面
  17. android+蓝牙+文件传输,蓝牙文件传输Android
  18. java代码json_JSON 解析(java代码)
  19. 网站注册邮件发送功能实现
  20. nginx反向代理去除目录层级转发

热门文章

  1. PHP array_intersect_uassoc
  2. PopupWindow的使用
  3. Adobe与Facebook联手推出Flash开发工具
  4. 『前端规范化』CSS命名规范化
  5. BZOJ2132 圈地计划
  6. Android自定义View探索—生命周期
  7. 性能计数器监控typeperf
  8. win7开启休眠功能
  9. UIKeyboardTypeNumberPad 数字键盘添加完成按钮
  10. 计算机原理综合设计实验报告,计算机组成原理--课程设计实验报告.doc