学习.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.mzph.cn/news/165374.shtml

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

相关文章

__attribute__((constructor))用法解析

__attribute__((constructor))是GCC和兼容的编译器中的一个特性&#xff0c;用于指示编译器将一个函数标记为在程序启动时自动执行的初始化函数。 同样的还有__attribute__((destructor))在main()函数后调用。 当你在一个函数声明或定义前加上__attribute__((constructor))属…

浅谈 Guava 中的 ImmutableMap.of 方法的坑

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐&…

vue项目下.env.development环境变量配置文件

.env.development 文件是一个用于开发环境配置的文件。在许多应用程序中&#xff0c;开发环境和生产环境具有不同的配置需求。.env.development 文件允许你在开发环境中定义特定的环境变量和配置选项。 一般来说&#xff0c;.env.development 文件用于存储开发环境相关的配置信…

国自然项目基金撰写的隐藏技巧、范例分析及提交前的自我审查

目录 一、基金项目申请要求、重点及项目介绍 二、基金的撰写技巧 三、基金撰写的隐藏技巧 四、范例分析及提交前的自我审查 更多应用 基金项目申请需要进行跨学科的技术融合&#xff0c;申请人需要与不同领域结合&#xff0c;形成多学科交叉的研究。基金项目申请在新时期更…

由红黑树引出的HashMap扩容机制的思考

红黑树是什么&#xff1f; 三大特点&#xff1a; 根节点是黑色&#xff0c;叶节点是不存储数据的黑色空节点 任何相邻的两个节点不能同时为红色 任意节点到其可到达的节点间包含相同数量的黑色节点 联想&#xff1a;Java HashMap底层红黑树原理 HashMap基于哈希表Map接口实…

快速掌握Pyqt5的三种主窗口

PyQt5是一个强大的跨平台GUI框架&#xff0c;它提供了多种不同类型的主窗口类&#xff0c;以满足不同的应用需求。下面是PyQt5中最常见的几种主窗口类型及其创建方式的简介&#xff1a; 1. QMainWindow QMainWindow是用于创建具有菜单栏、工具栏、状态栏和中心窗口部件&#…

内存池 示例一

内存池是一种管理内存分配和释放的技术&#xff0c;用于优化内存的使用效率。它通过预先分配一块内存区域&#xff0c;并将其划分为多个较小的块&#xff08;内存块池&#xff09;&#xff0c;然后按需分配这些内存块来减少内存碎片化和频繁的系统调用。这些内存块可以是相同大…

Centos7.9配置nfs共享及rsync同步

客户需求对oracle数据库做一个跨机房的备份&#xff0c;原环境已做rman备份和每天expdp全库导出&#xff0c;远端只有虚拟化环境&#xff0c;可提供一个虚拟机&#xff0c;2个机房间网络互通。 首先配置nfs服务端 查看操作系统版本 [rootnas199 ~]# more /etc/redhat-relea…

Python面经【1】

一、协程的相关概念 协程&#xff08;又称微线程&#xff09;运行在线程之上&#xff0c;更加轻量级&#xff0c;协程并没有增加线程总数&#xff0c;只是在线程的基础上通过分时复用的方式运行多个协程&#xff0c;大大提高工程效率。 协程的特点&#xff1a; 轻量级&#…

WordPress站点屏蔽过滤垃圾评论教程(Akismet反垃圾评论插件)

前段时间我的WordPress站点经常收到垃圾评论的轰炸&#xff0c;严重时一天会收到几十条垃圾评论。我这个小破站一没啥流量&#xff0c;二又不盈利&#xff0c;实在是不太理解为啥有人要这么执着地浪费资源在上面。 Akismet反垃圾评论插件 其实用了 Akismet 反垃圾评论插件后&a…

快速掌握Pyqt5的6种按钮

在PyQt5中&#xff0c;按钮是构建用户界面的基本元素之一&#xff0c;用于执行命令、启动功能或触发事件。PyQt5提供了多种类型的按钮&#xff0c;每种都适用于不同的场景和需求。 1. QPushButton QPushButton 是最常用的按钮类型&#xff0c;适用于大多数情况&#xff0c;如…

ARCore:在Android上构建令人惊叹的增强现实体验

ARCore&#xff1a;在Android上构建令人惊叹的增强现实体验 一、 AR 介绍1.1 AR技术简介1.2 AR技术原理1.3 AR技术应用领域 二、Google的增强现实平台ARCore2.1 ARCore简介2.2 ARCore API介绍2.3 ARCore API使用示例 三、总结 一、 AR 介绍 增强现实 Augmented Reality&#x…

【算法-字符串2】替换空格 + 反转单词

今天&#xff0c;带来字符串相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 1. 替换空格 题目描述&#xff1a;请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 难…

Lettuce使用详解

简介特点连接池连接池特点连接池管理连接池优势连接池配置参数 监控常用监控工具通过JMX监控通过Prometheus监控 代码示例拓展springboot中通过jmx上报到Prometheus代码示例更多Redis相关内容 简介 Lettuce 是一个高级的、线程安全的 Redis 客户端&#xff0c;用于与 Redis 数…

深度学习基础概念

1. 神经网络基础 神经元&#xff08;Neuron&#xff09;&#xff1a; 了解神经网络的基本组成单元。激活函数&#xff08;Activation Function&#xff09;&#xff1a; 学习常见的激活函数&#xff0c;如Sigmoid、ReLU等&#xff0c;以及它们在神经网络中的作用。前馈神经网络…

An issue was found when checking AAR metadata

一、报错信息 An issue was found when checking AAR metadata:1. Dependency androidx.activity:activity:1.8.0 requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs.:app is currently compiled against …

Python 异步套接字编程

异步套接字编程是异步编程在网络通信中的应用&#xff0c;它使用异步 IO 操作和事件循环来实现高并发的网络应用。Python 中的 asyncio 模块提供了对异步套接字编程的支持&#xff0c;以下是异步套接字编程的一些重要概念和使用方法&#xff1a; 1. 异步套接字服务器&#xff…

git与ssh多账户共存

git与ssh多账户共存 前言git多账户ssh多公钥参考 前言 在使用git与ssh时&#xff0c;经常会遇到多个账户共存的情况 例如使用不同的公钥登陆到不同的服务&#xff1b;使用不同的git信息进行commit git多账户 在默认情况下 git的信息存在 ~/.gitconfig 可以使用命令查看 git…

关于elementui和ant design vue无法禁止浏览器自动填充问题

以and design vue 为例&#xff1a; 图标用来显隐账号密码 html&#xff1a; <a-form-model-item label"账号密码:" prop"password"><a-input v-if"passwordTab" ref"passwordInput" v-model"form.password" typ…

详解最长公共子序列问题(三种方法)

这里&#xff0c;为了更方便地解释&#xff0c;我以洛谷上的一道典型题目为例&#xff0c;为大家讲解处理最长公共子序列问题的几种常见方法。这道题目中规定了两个子序列的长度相等&#xff0c;如果遇到不等的情况&#xff0c;也只需要对长度稍作修改即可&#xff0c;算法思想…