学习.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 才行&#…

Kubernetes异常排查方式

集群信息&#xff1a; 1. 显示 Kubernetes 版本&#xff1a;kubectl version 2. 显示集群信息&#xff1a;kubectl cluster-info 3. 列出集群中的所有节点&#xff1a;kubectl get nodes 4. 查看一个具体的节点详情&#xff1a;kubectl describe node <node-name> 5. 列…

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

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

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

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

使用多个域名存储网站资源更有效

1.cdn缓存更加方便 ​ cdn是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容均发、调度等功能模块&#xff0c;让用户就近获取所需要的内容&#xff0c;降低网络拥堵&#xff0c;提高用户访问速度和命中…

29 - 装饰器模式:如何优化电商系统中复杂的商品价格策略?

开始今天的学习之前&#xff0c;我想先请你思考一个问题。假设现在有这样一个需求&#xff0c;让你设计一个装修功能&#xff0c;用户可以动态选择不同的装修功能来装饰自己的房子。例如&#xff0c;水电装修、天花板以及粉刷墙等属于基本功能&#xff0c;而设计窗帘装饰窗户、…

学习grdecl文件格式

最近在学习grdecl文件格式&#xff0c;文档不多。查找资料发现&#xff0c;这个格式的文件是由斯伦贝谢公司的ECLIPSE专业软件生成的。 搜到一些文档&#xff0c;都是2010年之前的&#xff0c;似乎有些用处。文档也交代了这个文件格式分为二进制和文本格式。找到了一个库libecl…

console输出并写入

搞了好久搞出来的代码 //用两种代码 define保留 只显示时间 不显示年月 【成功】 #include <iostream> #include <fstream> #include <chrono> #include <ctime> #include <cstdarg>#define LOG_TO_CONSOLE_AND_FILE_WITH_DATE //#define LOG_T…

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

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

Qt手写ListView

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

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

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

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

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

浅用tensorflow天气预测

1&#xff0e;开发环境 &#xff08;1&#xff09;Python3.8 &#xff08;2&#xff09;Anaconda3 &#xff08;3&#xff09;Tensorflow &#xff08;4&#xff09;Numpy &#xff08;5&#xff09;Pandas &#xff08;6&#xff09;Sklearn 先依次安装好上面的软件和包…

嵌入式软件开发学习途径推荐

1、概述 嵌入式系统是当今智能化的重要组成部分&#xff0c;广泛应用于各行业和领域。学习内容多而杂&#xff0c;不同行业学习的内容也有一定差异。学习完一些基础课程后&#xff0c;工作中便是用到或根据就业方向去拓展自己的知识。这里推荐如下途径(后续可能会补充)&#xf…

document load 和 document ready 的区别

"document load" 和 "document ready" 都是 JavaScript 中用于处理文档加载事件的术语&#xff0c;但是它们之间有一些重要的区别。 document load 在传统的 JavaScript 中&#xff0c;document.load 事件是当整个 HTML 文档完全加载并出现在浏览器中时触…

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

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

C++标准模板(STL)- 类型支持 (类型修改,移除给定类型的一层指针,std::remove_pointer)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例化…

Android YUV存储方式

排名 性能&#xff1a;YUV444 > YUV422 > YUV420 > YUV411 YUV444&#xff1a;YUV444 提供最高质量的色彩准确性和图像细节&#xff0c;但需要更多的存储空间和传输带宽。适用于对图像质量要求很高的应用&#xff0c;如专业视频编辑或高端图像处理。YUV422&#xff1…

阻塞队列介绍(一)

1 基础概念 1.1 生产者消费者概念 生产者消费者是设计模式的一种。让生产者和消费者基于一个容器来解决强耦合问题。 生产者 消费者彼此之间不会直接通讯的&#xff0c;而是通过一个容器&#xff08;队列&#xff09;进行通讯。 所以生产者生产完数据后扔到容器中&#xff0c…

Qt QSpinBox与QDoubleSpinBox总结

QSpinBox 与 QDoubleSpinBox QSpinBox 和 QDoubleSpinBox是常用的数值输入和输出组件&#xff0c;我们将它们统称为 SpinBox。 从SpinBox读取的数据就是数值&#xff08;整数或浮点数&#xff09;&#xff0c;设置数值就可以直接显。QSpinBox 用于输入和输出整数&#xff0c;一…