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

  FluentValidation模块支持调用When和Unless函数设置验证规则的执行条件,其中when函数设置的是满足条件时执行,而Unless函数则是满足条件时不执行,这两个函数的使用示例如及效果如下所示:

 public AppInfoalidator() {RuleFor(x=>x.AppName).NotEmpty();RuleForEach(x => x.Roles).NotEmpty().WithMessage("角色属性第{CollectionIndex}个集合元素不能为空").MinimumLength(3).WithMessage("角色属性第{CollectionIndex}个集合元素长度不能小于3").When (x=>x.Roles.Count>4);RuleForEach(x => x.Users).ChildRules(r =>{r.RuleFor(r => r.UserName).NotEmpty().MinimumLength(5).WithMessage("用户属性第{CollectionIndex}个集合元素长度不能小于5").MaximumLength(10).NotEqual("test").WithMessage("用户属性第{CollectionIndex}个集合元素值不能等于test").Unless(x=>x.Sex=="男");});}

在这里插入图片描述
  默认情况下When和Unless函数应用于整个验证链中的所有验证函数,如果只想在满足条件时仅影响紧邻When和Unless函数前的验证函数,则需在When和Unless函数中设置第二个参数为ApplyConditionTo.CurrentValidator,这样的话,加入验证链中有4个验证函数,前3个每次都会调用,最后一个验证函数会根据条件调用。使用时可以根据实际需要在需要加调用条件的验证函数后追加When或Unless函数。
在这里插入图片描述

  如果是在相同条件下对多个属性进行验证,则可直接调用When或Unless函数,并将对多个属性的验证规则封装成函数作为输入参数,同时FluentValidation模块还提供Otherwise函数,当When或Unless函数条件不满足时,可以调用Otherwise函数中封装的验证规则进行验证。When或Unless函数,再加上Otherwise函数,类似于代码中的if else的逻辑。其使用示例及效果如下所示:

public AppInfoalidator() 
{RuleFor(x=>x.AppName).NotEmpty();When(x => x.AppState == 0, () =>{RuleForEach(x => x.Roles).NotEmpty().WithMessage("角色属性第{CollectionIndex}个集合元素不能为空").MinimumLength(3).WithMessage("角色属性第{CollectionIndex}个集合元素长度不能小于3");}).Otherwise(() =>{RuleForEach(x => x.Users).ChildRules(r =>{r.RuleFor(r => r.UserName).NotEmpty().MinimumLength(5).WithMessage("用户属性第{CollectionIndex}个集合元素长度不能小于5").MaximumLength(10).NotEqual("test").WithMessage("用户属性第{CollectionIndex}个集合元素值不能等于test");});});
}

在这里插入图片描述

  如果自定义验证类中对多个属性进行验证,但在某场景下仅需针对单个属性进行验证FluentValidation模块支持在调用验证类的Validate函数时通过输入参数指定需验证的属性,忽略其它属性,使用示例及效果如下所示:

//自定义验证类的构造函数中定义规则
public 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");});
}//调用验证类时指定需验证的属性AppInfoalidator appValidator=new AppInfoalidator();FluentValidation.Results.ValidationResult result = appValidator.Validate(app, options =>{options.IncludeProperties(x => x.Roles);});

在这里插入图片描述

  FluentValidation模块支持在自定义验证类的构造函数中分组验证规则,未分组的规则默认在default组中。调用验证类验证时,如果未指定验证组,则仅执行未分组的验证规则,支持在Validate函数的输入参数中指定单个或多个规则分组,如果要执行所有规则,则分组名称使用通配符*或者直接调用IncludeAllRuleSets函数。规则分组的使用示例及效果如下所示:

//自定义验证类的构造函数中定义规则组
public AppInfoalidator() 
{RuleFor(x=>x.AppName).NotEmpty();RuleSet("RoleCheck", () =>{RuleForEach(x => x.Roles).NotEmpty().WithMessage("角色属性第{CollectionIndex}个集合元素不能为空").MinimumLength(3).WithMessage("角色属性第{CollectionIndex}个集合元素长度不能小于3");});RuleSet("UserCheck", () =>{RuleForEach(x => x.Users).ChildRules(r =>{r.RuleFor(r => r.UserName).NotEmpty().MinimumLength(5).WithMessage("用户属性第{CollectionIndex}个集合元素长度不能小于5").MaximumLength(10).NotEqual("test").WithMessage("用户属性第{CollectionIndex}个集合元素值不能等于test");});});  
}//调用验证类时指定规则组
//1)调用default和RoleCheck规则组AppInfoalidator appValidator=new AppInfoalidator();FluentValidation.Results.ValidationResult result = appValidator.Validate(app,options=>{options.IncludeRuleSets("default", "RoleCheck");});//2) 调用UserCheck规则组AppInfoalidator appValidator=new AppInfoalidator();FluentValidation.Results.ValidationResult result = appValidator.Validate(app,options=>{options.IncludeRuleSets("UserCheck");//options.IncludeRuleSets("*")也适用}); //3)调用所有规则AppInfoalidator appValidator=new AppInfoalidator();FluentValidation.Results.ValidationResult result = appValidator.Validate(app,options=>{options.IncludeAllRuleSets();});

在这里插入图片描述

  
  

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

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

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

相关文章

Mysql 解决Invalid default value for ‘created_at‘

在mysql版本 8.0 和 5.* 之间数据互导的过程中,老是会出现各种错误,比如 这个created_at 一定要有一个默认值, 但是我加了 default null 还是会报错,于是对照了其他的DDL 发现,需要再加 null default null 才行&#…

从0开始学习JavaScript--JavaScript事件:响应与交互

JavaScript的事件处理是Web开发中至关重要的一部分,通过事件,能够实现用户与页面的互动,使得网页更加生动和交互性。本文将深入探讨JavaScript事件的各个方面,包括事件的基本概念、事件类型、事件对象、事件冒泡与捕获、事件委托、…

如何看待 2023 OPPO 开发者大会?潘塔纳尔进展如何?AndesGPT 有哪些亮点?

在2023年11月16日举行的OPPO开发者大会(ODC23)上,OPPO带来了全新ColorOS 14、全新互联网服务生态以及健康服务进展,这些新动态中有许多值得关注的地方。 1、全新ColorOS 14: 效率提升:ColorOS 14通过一系列…

虚拟机可ping树莓派树莓派无法ping虚拟机 的解决办法

问题描述 在学习交叉编译的过程中,发现了树莓派无法ping通虚拟机的问题。所以我尝试了各种ping,发现: 虚拟机可以ping通树莓派和主机树莓派可以ping通主机主机可以ping通树莓派和虚拟机唯独树莓派没法ping通虚拟机 尝试各种方法后找到一种…

Qt手写ListView

创建视图: QHBoxLayout* pHLay new QHBoxLayout(this);m_pLeftTree new QTreeView(this);m_pLeftTree->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑m_pLeftTree->setFixedWidth(300);创建模型和模型项: m_pLeftTree…

车载通信架构 —— 传统车内通信网络FlexRay(较高速度高容错、较灵活拓扑结构)

车载通信架构 —— 传统车内通信网络FlexRay(较高速度高容错、较灵活拓扑结构) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,…

如何在3dMax中根据AutoCAD地形规划文件对地形进行建模?

在3dMax中根据Autocad地形规划文件对地形进行建模的方法 直入主题,要根据包含地形图的DWG (Autocad) 文件进行地形建模,方法步骤如下: 1.运行3dmax软件,点击“文件(File)->导入(Import&…

用友NC word.docx接口存在任意文件读取漏洞 附POC

@[toc] 用友NC word.docx接口存在任意文件读取漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使…

使用Python的turtle库绘制随机生成的雪花

1.1引言 在这篇文章中,我们将使用Python的turtle库来绘制一个具有分支结构的雪花。该程序使用循环和随机颜色选择来绘制20个不同大小和颜色的雪花。turtle库是一个流行的绘图库,常用于创建图形用户界面和简单的动画。这个代码实现了一个有趣的应用&…

Elasticsearch:ES|QL 查询中的元数据字段及多值字段

在今天的文章里,我来介绍一下 ES|QL 里的元数据字段以及多值字段。我们可以利用这些元数据字段以及多值字段来针对我们的查询进行定制。 ES|QL 源数据字段 ES|QL 可以访问元数据字段。 目前支持的有: _index:文档所属的索引名称。 该字段的…

vue2项目从0搭建(三):配置环境变量及对应的webpack配置

前言 实际业务开发中,一个项目很可能会同时配置好几套环境。 比如:常规开发环境,开发测试环境,正式的测试环境,预发测试环境,客户甲的生产环境,客户乙的生产环境,通用生产环境,独立应用环境,微前端环境,大屏专用环境,移动端环境。 一女多嫁的实际业务场景,就需要我们进行多样…

Android 提示框代码 java语言

在Android中,你可以使用 AlertDialog 类来创建提示框。以下是一个简单的Java代码示例,演示如何创建和显示一个基本的提示框: import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; im…

RocketMq架构和源码解析

NameServer:作为注册中心,提供路由注册、路由踢出、路由发现功能,舍弃强一致,保证高可用,集群中各个节点不会实时通讯,其中一个节点下线之后,会提供另外一个节点保证路由功能。 Broker&#xf…

vatee万腾的科技征途:Vatee独特探索的数字化力量

在数字化时代的浪潮中,Vatee万腾以其独特的科技征途成为引领者。公司在数字化领域的探索之路不仅是技术的创新,更是一种对未知的勇敢涉足,是对新时代的深刻洞察和积极实践。 Vatee万腾通过独特的探索,展示了在数字化征途上的创新力…

Matplotlib子图的创建_Python数据分析与可视化

Matplotlib子图的创建 plt.axes创建子图fig.add_axes()创建子图 plt.axes创建子图 前面已经介绍过plt.axes函数,这个函数默认配置是创建一个标准的坐标轴,填满整张图。 它还有一个可选的参数,由图形坐标系统的四个值构成。这四个值表示为坐…

Spine深入学习 —— 数据

atlas数据的处理 作用 图集,描述了spine使用的图片信息。 结构 page 页块 页块包含了页图像名称, 以及加载和渲染图像的相关信息。 page1.pngsize: 640, 480format: RGBA8888filter: Linear, Linearrepeat: nonepma: truename: 首行为该页中的图像名称. 图片位…

Python武器库开发-前端篇之CSS盒模型(三十一)

前端篇之CSS盒模型(三十一) CSS盒模型是指网页中的每个元素可以看做是一个矩形盒子,该盒子有四个主要部分组成:content、padding、border和margin。其中: content:指盒子中的内容区域,可以包含文本、图像、视频、其他…

RedLock底层源码分析

RedLock底层源码分析 一、Redlock红锁算法 https://redis.io/docs/manual/patterns/distributed-locks/官网说明 1、为什么要学习这个?怎么产生的? ​ 一个很直接的问题,当我使用redis锁的那台机器挂了,出现了单点故障了&#…

游戏开发引擎Cocos Creator和Unity如何对接广告-AdSet聚合广告平台

在游戏开发方面,游戏引擎的选择对开发过程和最终的产品质量有着重大的影响,Unity和Cocos是目前全球两大商用、通用交互内容开发工具,这两款引擎受到广泛关注,本文将从多个维度对两者进行比较,为开发者提供正确的选择建…

84基于matlab的数字图像处理

基于matlab的数字图像处理,数据可更换自己的,程序已调通,可直接运行。 84matlab数字图像处理图像增强 (xiaohongshu.com)https://www.xiaohongshu.com/explore/656219d80000000032034dea