.NET Core中的验证组件FluentValidation的实战分享
今天有人问我能不能出一篇FluentValidation的教程,刚好今天在实现我们的.NET Core实战项目之CMS的修改密码部分的功能中有用到FluentValidation
,所以就以修改用户密码为实例来为大家进行一下ASP.NET Core中的验证组件FluentValidation的实战分享,希望能对大家有所帮助!由于本文以.NET Core实战项目之CMS中的项目为例,因此此篇文章会收录到系列教程的目录中。
本篇文章已经收纳入《.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划》另附上.NET Core实战项目交流群:637326624 有兴趣的朋友可以共同交流技术经验。
作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/10397393.html
写在前面
开始之前还是有必要为大家科普一下FluentValidation的概念,它是一个非常流行的用来构建强类型验证规则的.NET库。而且它对ASP.NETCore支持十分友好,可以很方便的进行集成使用,集成后我们可以很方便的对数据模型进行强验证。
为什么要使用它呢?
因为它足够简单,而且功能强大,可以很方便的来为我们建立起强大的实体验证功能!那么怎么使用它呢?下面我们就通过修改密码的实例来进行讲解!
FluentValidation使用
开始使用之前我们先构思一下密码修改需要进行的验证规则:
密码强度验证
旧密码是否跟数据库中的一样
新密码不能跟旧密码一样
重复密码需要跟新密码一样
当前页面用户必须登录,用户ID必须大于0
好了,假设我们需要实现上述的功能验证,怎么来进行实现呢?当然我们可以通过.net core中的DataAnnoations 进行实现,但是今天我们要使用FluentValidation来实现一番。下面是具体步骤!
使用
首先当然是添加
FluentValidation.AspNetCore
Nuget包了:Install-Package FluentValidation.AspNetCore
安装后,需要在应用程序的
Startup
中的ConfigureServices
方法中调用AddFluentValidation
内的扩展方法。(这里需要using FluentValidation.AspNetCore
),需要注意的是这个扩展方法必须在调用AddMvc
之后进行调用。如下所示:注意:
AddFluentValidation方法必须在AddMvc之后进行调用
我在AddFluentValidation中加入了两个配置,都有注释你应该能看懂。
下面根据我们步骤开始之前的分析创建如下的修改密码的视图模型
为这个视图模型创建一个校验类,用来添加我们上面列出来的校验规则,如下所示:
注:上述代码应该很好理解吧,为了防止有初学者,所以这里再废话一下:
为每个需要验证的实体创建一个这样的类,如我们要验证的实体是
ChangePasswordModel
因此我们创建一个ChangePasswordModelValidation
验证类需要继承
AbstractValidator<T>
如:ChangePasswordModelValidation : AbstractValidator在构造函数中写验证规则
RuleFor()是为当前实体的某一个属性添加验证,如:
RuleFor(x => x.Id).NotNull().GreaterThan(0)
就是验证这个实体的Id
这个字段不能为空,而且必须大于0.后面的WithMessage
就是如果前面校验失败就返回的错误信息如果要添加自定义的验证,如:判断新密码是否与旧密码一致,这里就先定义这个校验方法,如:
NewNotEqualsOld
这个方法我们自定义的,然后再RuleFor().Must(NewNotEqualsOld) 即可应用
在我们的修改密码功能提交的时候应用我们的验证,只需要正常的使用即可,如:
如上所示,该怎么用还怎么用,然后再继续模型校验的时候会自动应用我们的规则。如果我们定义的规则校验失败的话,这时候
ModelState.IsValid
会返回false
这时候我们就可以把错误信息通过我们在BaseController
中自定义的ToErrorString(ModelState,"||");
方法打印出来。
功能验证
这里我们先把前台的验证规则都给去掉,然后我们刚开始设计的几个规则的校验吧!
密码强度验证
这里我们简单的继续密码长度的校验,如长度满足在:4-32位 ,我们对应的FluentValidation
的验证规则为RuleFor(x => x.OldPassword).NotEmpty().Length(4, 32)
这里还进行了非空的校验。如下图所示:
旧密码是否跟数据库中的一样
这个校验我是在密码提交后进行的校验,没有放在FluentValidation
中,所以这块只展示测试效果图吧
新密码不能跟旧密码一样
这部分我们对应的FluentValidation
中的验证规则是:新增自定义方法,然后调用RuleFor().Must(NewNotEqualsOld).WithMessage("新密码不能跟旧密码一样")
效果如下所示:
重复密码需要跟新密码一样
这部分我们对应的FluentValidation
中的验证规则是:新增自定义方法,然后调用RuleFor().Must(ReEqualsNew).WithMessage("重复密码必须跟新密码一样")
效果如下所示:
当前页面用户必须登录,用户ID必须大于0
这部分我们对应的FluentValidation
中的验证规则是:RuleFor()..NotNull().GreaterThan(0)
效果如下所示:
源码地址
这个系列教程的源码我会开放在GitHub以及码云上,有兴趣的朋友可以下载查看!觉得不错的欢迎Star
GitHub:https://github.com/yilezhu/Czar.Cms
码云:https://gitee.com/yilezhu/Czar.Cms
如果你觉得这个系列对您有所帮助的话,欢迎以各种方式进行赞助,当然给个Star支持下也是可以滴!另外一种最简单粗暴的方式就是下面这种直接关注我们的公众号了:
总结
本篇文章,我通过用户密码修改的实例来为大家详细讲解了FluentValidation
的使用以及注意事项,希望能对大家有所帮助。因为本篇文章使用我们系列教程中的实例,所以本篇文章会收录至系列教程的目录中!本篇文章用了两个番茄时间才完成。
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
.NET Core中的验证组件FluentValidation的实战分享相关推荐
- Asp.Net Core中利用Seq组件展示结构化日志功能
在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...
- Asp.Net Core 中IdentityServer4 授权中心之应用实战
一.前言 查阅了大多数相关资料,搜索到的IdentityServer4 的应用文章大多是比较简单并且多是翻译官网的文档编写的,我这里在 Asp.Net Core 中IdentityServer4 的应 ...
- .Net Core中的日志组件(Logging)
1.介绍 Logging组件是微软实现的日志记录组件包括控制台(Console).调试(Debug).事件日志(EventLog)和TraceSource,但是没有实现最常用用的文件记录日志功能(可以 ...
- android 布局完成,Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享...
< ?xml version="1.0" encoding="utf-8"?> < FrameLayout xmlns:android=&qu ...
- 小程序中里的bindinput_云开发实战分享|诗和远方:旅行小账本云开发
原创:豪豪 前言 最近沉迷小程序开发,发现了一款功能.界面.体验俱佳的小程序"旅行小账本".着手做了个简约版--"旅行小账本".效果比较满意,毕竟前后台一人单干 ...
- 中间件是什么?在.NET Core中的工作原理又是怎样的呢?
本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core appsettings.json文件 ASP.NET Core 中的中间件(Middleware ...
- .net授权获取openid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权
一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...
- Asp.Net Core 中IdentityServer4 实战之角色授权详解
一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,也用到了IdentityServer4的授权,改造过程中发现比较适合基于Role ...
- Asp.Net Core 中IdentityServer4 实战之 Claim详解
一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会 ...
最新文章
- stm32实际运用中遇到的问题
- linux 时间戳 c语言,c语言中的时间戳和时间格式
- 对于58同城自动登陆的补充【主要是代码】
- Dapr牵手.NET学习笔记:用docker-compose部署服务
- springboot, thymeleaf 教你快速搭建网站
- spring boot 三种入参
- ISE MAP报错: Unsupported programming for BSCAN block and JTAG_CHAIN attribute value 1的解决方法...
- D. The Door Problem 带权并查集
- USACO 3.4 Closed Fences (计算几何)
- 银行保险机构信息科技外包风险管理办法学习笔记
- Final Cut Pro X 精选插件合集!
- HAL库版STM32双轮自平衡车(三) ———代码精讲
- Hermez官方文档翻译(二)开发者-开发指南
- 制作思维导图的要点总结
- pdf转wordpptexceljpg图片pdf编辑器转换修改
- 书籍折页是什么效果_问题:WPS里页面设置中的拼页,书籍折页,反向书籍折页分别是什么意思?打印出来的效果是什么样的? 要双面打印...
- 后台管理系统中的登录页面
- 基于云创部署spark
- 【中亦安图】Oracle内存过度消耗风险提醒(6)
- 微信小程序 云数据库使用(上)