.net core webapi 使用ValidationAttribute对比同一对象的多个参数
众所周知,在使用DataAnnotations数据验证的时候,特别是针对同一个InputDto的多个属性进行对比的时候,例如起始日期不能大于结束日期,我们需要在Attribute中知道当前InputDto对象的类型和对象值,以便进行两个属性的对比。
做到以上操作,我们需要使用ValidationAttribute.IsValid(object value, ValidationContext validationContext)方法,其中ValidationContext对象会提供当前InputDto的类型和参数值。
如果我们要实现大于或等于的特性验证,代码如下:
//大于或等于的特性验证
public class GreaterOrEqualAttribute : ValidationAttribute
{
//需要被对比的属性名称
public string PropertyName { get;}
public GreaterOrEqualAttribute(string propertyName) {
PropertyName = propertyName?.Trim()??"";
} protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if(PropertyName.IsNullOrEmpty())
return new ValidationResult($"{nameof(GreaterOrEqualAttribute)}.{nameof(PropertyName)}参数不能为空值"); //获取PropertyName的属性值
var propertyInfo = validationContext.ObjectType.GetProperty(PropertyName);
var propertyValue = propertyInfo?.GetValue(validationContext.ObjectInstance, null);
//如果给定对比的值为null,则返回成功
if(propertyValue==null) return ValidationResult.Success; var thisTypeCode = Convert.GetTypeCode(value);
var thatTypeCode = Convert.GetTypeCode(propertyValue);
if(thisTypeCode!=thatTypeCode)
return new ValidationResult($"{validationContext.ObjectType.Name}.{PropertyName}与{validationContext.ObjectType.Name}.{validationContext.DisplayName}的类型不匹配"); dynamic thisValue = Convert.ChangeType(value, thisTypeCode);
dynamic thatValue = Convert.ChangeType(propertyValue, thatTypeCode);
//如果当前值大于或等于给定值,则返回成功
if(thisValue>=thatValue) return ValidationResult.Success;
return new ValidationResult(ErrorMessage.IsNullOrEmpty()? $"{validationContext.ObjectType.Name}.{PropertyName}必须大于或等于{validationContext.ObjectType.Name}.{validationContext.DisplayName}":ErrorMessage);
}
}
其中validationContext.ObjectType就是InputDto对象的类型,validationContext.ObjectInstance是InputDto对象的实例,有了这两个参数,我们可以在数据验证中尽情的操作。
接下来我们定义一个InputDto类型来测试一下,验证起始时间和结束时间。代码如下:
public class InputDto
{
//起始时间
public DateTime? BeginDate { get; set; } = DateTime.Now; //结束时间
[GreaterOrEqual(nameof(BeginDate))]
public DateTime? EndDate { get; set; } = DateTime.Now;
}
测试结果如下:
.net core webapi 使用ValidationAttribute对比同一对象的多个参数的更多相关文章
- ASP.Net Core WebApi几种版本控制对比
版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...
- BeetleX和Asp.net Core之webapi基础性能对比
本文主要针对BeetleX和Asp.net Core在基础WebApi功能性能对比 测试环境描述 硬件配置:E1230V2 16G内存 10Gb带宽 操作系统:Windows server 2008 ...
- Net Core WebApi几种版本控制对比
Net Core WebApi几种版本控制对比 一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方 ...
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
- 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程
#前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...
- .Net Core WebAPI 基于Task的同步&异步编程快速入门
.Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以及基于Task的异步编程(asy ...
- asp.net core webapi之跨域(Cors)访问
这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...
- ASP.NET Core WebAPI 开发-新建WebAPI项目
ASP.NET Core WebAPI 开发-新建WebAPI项目, ASP.NET Core 1.0 RC2 即将发布,我们现在来学习一下 ASP.NET Core WebAPI开发. 网上已经有泄 ...
- Asp.net Core WebApi 使用Swagger做帮助文档,并且自定义Swagger的UI
WebApi写好之后,在线帮助文档以及能够在线调试的工具是专业化的表现,而Swagger毫无疑问是做Docs的最佳工具,自动生成每个Controller的接口说明,自动将参数解析成json,并且能够在 ...
随机推荐
- 场景:如果一个select下拉框的值被选中,其他两个字段值的校验也生效
$("#operationType").change(function(){ if(this.value==1){ $('[name="assigneeCardType& ...
- javascript 之 第七章第一节(递归)
先举例: function factorial(num) { ) { return num; } else { ); } } //输出120 //进一步去思考有名字的函数,且名字不会有变化的情况下,这 ...
- 从事三年java开发后, 我打算转人工智能
作为一个2015年参加java培训,2016年计算机科学与技术本科毕业后一直从事java开发的程序员来说, 做出这一步真的不容易, 可是我没赶上java最火的时候,反而渐渐感受到了java的没落, 目 ...
- 用JS更好的实现响应式布局
响应式布局更加高效的方法: 代码实现 <script> $(function() { (function(){ var $html = $('html'); var $window = $ ...
- OpenVPN部署,实现访问云服务器的内网
本教程不描述如何FQ 一.OpenVPN服务端部署 $ yum -y install net-tools lzo lzo-devel openssl-devel pam-devel gcc gcc-c ...
- 在微信浏览器中 location.reload() 不刷新解决方案(直接调用方法)
1.问题 在微信浏览器中,需要时刷新当前页面. 正常情况下我们直接使用 location.reload 方法来刷新. 2.解决方法 function realod(){ var {search,hre ...
- vmstat命令参数介绍
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...
- 编译原理中DFA最小化
关于编译原理最小化的操作,专业术语请移步至:http://www.360doc.com/content/18/0601/21/11962419_758841916.shtml 这里只是记录一下个人的理 ...
- Ubuntu - Start - 必要软件安装
1.安装Chromium浏览器 sudo apt install chromium-browser 如果出错, 先更新下apt sudo apt update 2. 安装rime输入法 sudo ap ...
- 使用npm私有服务器保存公司内部强业务类型组件(三):关于业务性组件的一点思考
编写业务性组件最难的地方不在于技术,而在于沟通, 1:前端将业务给封装了起来,必然导致产品在设计的时候多了一层考虑,在新增功能的时候 他要考虑这个功能是不是在其他项目也需要,如果不是的话,就不应该放在 ...