学习.NET验证模块FluentValidation的基本用法(续1:其它常见用法)

  FluentValidation模块支持链式验证方法调用,也就是说,除了 RuleFor(r => r.UserName).NotEmpty()调用方式之外,还可以将对单个属性的多种验证函数以链式调用方式串接起来,比如UserName属性不能为空,长度在5~10之间,且不能是test,使用FluentValidation模块的链式验证方式及运行效果如下所示:

RuleFor(r => .UserName).NotEmpty().MinimumLength(5).MaximumLength(10).NotEqual("test");

在这里插入图片描述
  调用继承自AbstractValidator类的自定义验证类验证时,一般调用Validate函数获取验证结果及验证错误信息,除此之外,还可以调用ValidateAndThrow函数,当验证失败时直接抛ValidationException异常,后者包含类型为IEnumerable<ValidationFailure>的验证错误信息集合,供程序捕获及处理。

AppUserValidator validationRules = new AppUserValidator();
try
{validationRules.ValidateAndThrow(user);
}
catch (FluentValidation.ValidationException ex)
{MessageBox.Show(ex.Message);
}

在这里插入图片描述

  FluentValidation模块支持两种方式验证复杂类型的属性,方式1是为每种类型定义相应的验证类,并在上一级类型的验证类构造函数中调用SetValidator函数指定类型属性的验证,方式2是在上一级类型的验证类构造函数中按属性层级设置需要验证的规则(官网说明中提到第2种方式要手动增加属性的非null条件验证,否则就不会对下一级属性进行自动验证,但是测试时并没有出现这种情况,可以正常运行AppUser实例对象的验证),这两种方式的使用示例和效果如下所示:

public class AppUser
{public string UserName { get; set; }public string Sex { get; set; }public int Age { get; set; }public string Email { get; set; }
}public class AppInfo
{public string AppName { get; set; }public AppUser User { get; set; }
}public class AppInfoalidator : AbstractValidator<AppInfo>
{//方式1public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleFor(x=>x.User).SetValidator(new AppUserValidator());}//方式2public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleFor(x=>x.User.UserName).NotEmpty().MinimumLength(5).MaximumLength(10).NotEqual("test");    }
}
public class AppUserValidator:AbstractValidator<AppUser>
{public AppUserValidator(){RuleFor(r => r.UserName).NotEmpty().MinimumLength(5).MaximumLength(10).NotEqual("test");}
}

在这里插入图片描述

  针对集合类型的属性,FluentValidation模块提供了RuleForEach函数验证集合属性,针对简单类型的集合属性,可以直接调用RuleForEach对每个元素进行验证,如下所示。

public class AppInfo
{public string AppName { get; set; }public List<string> Roles { get; set; }
}public class AppInfoalidator : AbstractValidator<AppInfo>
{public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleForEach(x => x.Roles).NotEmpty().WithMessage("第{CollectionIndex}个集合元素不能为空").MinimumLength(3).WithMessage("第{CollectionIndex}个集合元素长度不能小于3");}
}AppInfo app = new AppInfo();
app.Roles = new List<string>();
app.Roles.Add(string.Empty);
app.Roles.Add("办公室主任");
app.Roles.Add("职员");AppInfoalidator appValidator=new AppInfoalidator();
FluentValidation.Results.ValidationResult result =appValidator.Validate(app);
if(!result.IsValid)
{MessageBox.Show(result.ToString());
}

在这里插入图片描述

  针对复杂类型的集合属性,类似于上面复杂类型的属性验证方式,既可以调用RuleForEach和SetValidator函数设置每个元素的验证类,也可以调用 RuleForEach和ChildRules函数直接设置每个元素的验证方式,这两种方式的使用示例和效果如下所示:

public class AppUser
{public string UserName { get; set; }public string Sex { get; set; }public int Age { get; set; }public string Email { get; set; }
}public class AppInfo
{public string AppName { get; set; }public List<string> Roles { get; set; }public List<AppUser> Users { get; set; }
}public class AppInfoalidator : AbstractValidator<AppInfo>
{//方式1public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleForEach(x => x.Roles).NotEmpty().WithMessage("角色属性第{CollectionIndex}个集合元素不能为空").MinimumLength(3).WithMessage("角色属性第{CollectionIndex}个集合元素长度不能小于3");RuleForEach(x => x.Users).SetValidator(new AppUserValidator());}//方式2public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleForEach(x => x.Roles).NotEmpty().WithMessage("角色属性第{CollectionIndex}个集合元素不能为空").MinimumLength(3).WithMessage("角色属性第{CollectionIndex}个集合元素长度不能小于3");RuleForEach(x => x.Users).ChildRules(r =>{r.RuleFor(r => r.UserName).NotEmpty().MinimumLength(5).WithMessage("用户属性第{CollectionIndex}个集合元素长度不能小于5").MaximumLength(10).NotEqual("test").WithMessage("用户属性第{CollectionIndex}个集合元素值不能等于test");});}
}
public class AppUserValidator:AbstractValidator<AppUser>
{public AppUserValidator(){RuleFor(r => r.UserName).NotEmpty().MinimumLength(5).WithMessage("用户属性第{CollectionIndex}个集合元素长度不能小于5").MaximumLength(10).NotEqual("test").WithMessage("用户属性第{CollectionIndex}个集合元素值不能等于test");}
}

在这里插入图片描述

  
  

参考文献:
[1]https://docs.fluentvalidation.net/en/latest/start.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/212450.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】who命令使用

who who命令用于显示系统中有哪些使用者正在上面&#xff0c;显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。 著者 由Joseph Arceneaux、David MacKenzie和Michael Stone撰写。 语法 who [选项] [文件|参数] who命…

Android设计模式--装饰模式

千淘万漉虽辛苦&#xff0c;吹尽黄沙始到金 一&#xff0c;定义 动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;装饰模式相比生成子类更为灵活。 装饰模式也叫包装模式&#xff0c;结构型设计模式之一&#xff0c;其使用一种对客户端透明的方式来动态地扩展…

C语言之字符串函数

C语言之字符串函数 文章目录 C语言之字符串函数1. strlen的使用和模拟实现1.1 strlen的使用1.2 strlen的模拟实现 2. strcpy的使用和模拟实现2.1 strcpy的使用2.2 strncpy的使用2.3 strcpy的模拟实现 3. strcat的使用和模拟实现3.1 strcat的使用3.2 strncat3.3 strcat的模拟实现…

Blender烘焙AO操作及对应的python代码

&#xff08;一&#xff09;Blender软件操作 1. 导入模型&#xff08;这里省略&#xff09; 2. 材质设置 模型使用的所有材质都需要删除Surface Shader&#xff0c;没有其他多余的计算&#xff0c;可以大量缩短烘焙时间。删除之后的只留下一个材质输出节点&#xff0c;如图所…

深信服防火墙路由模式开局部署-手把手教学(小白篇)

PS&#xff1a;深信服的设备只有400能够通过console连接&#xff0c;一般用户是无法连接的&#xff0c;所以大家不要妄想着从Console连接设备了&#xff0c;开局就通过MANAGE进入Web就可以 接通电源后&#xff0c;开机拿一根网线&#xff0c;一端连接防火墙的MANAGE口&#xf…

一致性 Hash 算法 Hash 环发生偏移怎么解决

本篇是对文章《一文彻底读懂一致性哈希算法》的重写&#xff0c;图文并茂&#xff0c;篇幅较长&#xff0c;欢迎阅读完提供宝贵的建议&#xff0c;一起提升文章质量。如果感觉不错不要忘记点赞、关注、转发哦。原文链接&#xff1a; 《一文彻底读懂一致性Hash 算法》 通过阅读本…

土地利用数据技术服务

一、背景介绍 土地是人类赖以生存与发展的重要资源和物质保障&#xff0c;在“人口&#xff0d;资源&#xff0d;环境&#xff0d;发展&#xff08;PRED&#xff09;”复合系统 中&#xff0c;土地资源处于基础地位。随着现代社会人口的不断增长以及工业化、城市化进程的加速&a…

【硬核HeyGen平替】在window平台上使用MyHeyGen

最近在研究HeyGen的平替开源项目&#xff0c;然后发现了MyHeyGen这个项目&#xff0c;但是文档上面并没有说明如果在window平台上使用&#xff0c;考虑到非window平台安装显卡驱动什么的比较繁琐&#xff0c;所以尝试硬着头皮干... 前提 开源项目中所需的环境准备要先准备好 1…

C语言——文件操作

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 我辈皆凡人&#xff0c;用一生铺就的…

flink和机器学习模型的常用组合方式

背景 flink是一个低延迟高吞吐的系统&#xff0c;每秒处理的数据量高达数百万&#xff0c;而机器模型一般比较笨重&#xff0c;虽然功能强大&#xff0c;但是qps一般都比较低&#xff0c;日常工作中&#xff0c;我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…

iframe内部子页面与外部主页面通讯

文章目录 一、问题二、解决2.1、子页面2.2、主页面 三、知识点3.1、[浏览器兼容性](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7)3.2、详解3.2.1、发送方3.2.2、接收方 一、问题 如上所示&a…

STM32 中断系统

单片机学习 目录 文章目录 前言 一、中断系统 1.1 什么是中断 1.2 中断优先级 1.3 中断嵌套 1.4 C语言中的中断程序 二、STM32的中断通道和中断向量 2.1 中断通道 2.2 嵌套向量中断控制器NVIC 2.2.1 什么是NVIC 2.2.2 NVIC基本结构 2.2.3抢占优先级和响应优先级 2.2.4 NVIC的优…