欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET Core中的验证组件FluentValidation的实战分享

程序员文章站 2022-07-23 07:55:22
今天有人问我能不能出一篇FluentValidation的教程,刚好今天在实现我们的.NET Core实战项目之CMS的修改密码部分的功能中有用到 ,所以就以修改用户密码为实例来为大家进行一下ASP.NET Core中的验证组件FluentValidation的实战分享,希望能对大家有所帮助!由于本 ......

今天有人问我能不能出一篇fluentvalidation的教程,刚好今天在实现我们的.net core实战项目之cms的修改密码部分的功能中有用到fluentvalidation,所以就以修改用户密码为实例来为大家进行一下asp.net core中的验证组件fluentvalidation的实战分享,希望能对大家有所帮助!由于本文以.net core实战项目之cms中的项目为例,因此此篇文章会收录到系列教程的目录中。

本篇文章已经收纳入《.net core实战项目之cms 第一章 入门篇-开篇及总体规划》另附上.net core实战项目交流群:637326624 有兴趣的朋友可以共同交流技术经验。
作者:依乐祝
原文地址:

写在前面

开始之前还是有必要为大家科普一下fluentvalidation的概念,它是一个非常流行的用来构建强类型验证规则的.net库。而且它对asp.netcore支持十分友好,可以很方便的进行集成使用,集成后我们可以很方便的对数据模型进行强验证。
另外附上github地址:https://github.com/jeremyskinner/fluentvalidation 有近四千多的star说明受众还是挺多的
官方文档:
为什么要使用它呢?
因为它足够简单,而且功能强大,可以很方便的来为我们建立起强大的实体验证功能!另外社区也挺活跃,作者也在持续维护中。那么怎么使用它呢?下面我们就通过修改密码的实例来进行讲解!

fluentvalidation使用

开始使用之前我们先构思一下密码修改需要进行的验证规则:

  • 密码强度验证
  • 旧密码是否跟数据库中的一样
  • 新密码不能跟旧密码一样
  • 重复密码需要跟新密码一样
  • 当前页面用户必须登录,用户id必须大于0

好了,假设我们需要实现上述的功能验证,怎么来进行实现呢?当然我们可以通过.net core中的dataannoations 进行实现,但是今天我们要使用fluentvalidation来实现一番。下面是具体步骤!

使用

  1. 首先当然是添加fluentvalidation.aspnetcore nuget包了:

    install-package fluentvalidation.aspnetcore
  2. 安装后,需要在应用程序的startup中的configureservices方法中调用addfluentvalidation内的扩展方法。(这里需要using fluentvalidation.aspnetcore),需要注意的是这个扩展方法必须在调用addmvc 之后进行调用。如下所示:

    .NET Core中的验证组件FluentValidation的实战分享

    注意:

    1. addfluentvalidation方法必须在addmvc之后进行调用

    2. 我在addfluentvalidation中加入了两个配置,都有注释你应该能看懂。

  3. 下面根据我们步骤开始之前的分析创建如下的修改密码的视图模型

    /**
    *┌──────────────────────────────────────────────────────────────┐
    *│ 描    述:修改密码实体                                                    
    *│ 作    者:yilezhu                                             
    *│ 版    本:1.0                                                 
    *│ 创建时间:2019/1/22 12:50:54                             
    *└──────────────────────────────────────────────────────────────┘
    *┌──────────────────────────────────────────────────────────────┐
    *│ 命名空间: czar.cms.viewmodels.manager                                   
    *│ 类    名: changepasswordmodel                                      
    *└──────────────────────────────────────────────────────────────┘
    */
    using system;
    using system.collections.generic;
    using system.text;
    
    namespace czar.cms.viewmodels
    {
        public class changepasswordmodel
        {
            /// <summary>
            /// 当前管理员主键
            /// </summary>
            public int id { get; set; }
            /// <summary>
            /// 旧密码
            /// </summary>
            public string oldpassword { get; set; }
            /// <summary>
            /// 新密码
            /// </summary>
            public string newpassword { get; set; }
            /// <summary>
            /// 重复密码
            /// </summary>
            public string newpasswordre { get; set; }
        }
    }
    
  4. 为这个视图模型创建一个校验类,用来添加我们上面列出来的校验规则,如下所示:

    using czar.cms.viewmodels;
    using fluentvalidation;
    using system;
    using system.collections.generic;
    using system.linq;
    using system.threading.tasks;
    using czar.cms.core.extensions;
    
    namespace czar.cms.admin.validation
    {
        public class changepasswordmodelvalidation : abstractvalidator<changepasswordmodel>
        {
            public changepasswordmodelvalidation()
            {
                cascademode = cascademode.stoponfirstfailure;
                rulefor(x => x.id).notnull().greaterthan(0).withmessage("用户信息获取异常");
                rulefor(x => x.oldpassword).notempty().length(4, 32).withmessage("旧密码不能为空且长度必须符合规则");
                rulefor(x => x.newpassword).notempty().length(4, 32).withmessage("新密码不能为空且长度必须符合规则")
                    .must(newnotequalsold).withmessage("新密码不能跟旧密码一样");
                rulefor(x => x.newpasswordre).notempty().withmessage("重复密码不能为空").must(reequalsnew).withmessage("重复密码必须跟新密码一样");
    
            }
    
            /// <summary>
            /// 判断新旧密码是否一样
            /// </summary>
            /// <param name="model">实体对象</param>
            /// <param name="newpwd">新密码</param>
            /// <returns>结果</returns>
            private bool newnotequalsold(changepasswordmodel model , string newpwd)
            {
                return model.oldpassword!=newpwd;
            }
    
            /// <summary>
            /// 判断新密码与重复密码是否一样
            /// </summary>
            /// <param name="model"></param>
            /// <param name="newpwdre"></param>
            /// <returns></returns>
            private bool reequalsnew(changepasswordmodel model, string newpwdre)
            {
                return model.newpassword == newpwdre;
            }
        }
    }
    

    注:上述代码应该很好理解吧,为了防止有初学者,所以这里再废话一下:

    1. 为每个需要验证的实体创建一个这样的类,如我们要验证的实体是changepasswordmodel 因此我们创建一个changepasswordmodelvalidation
    2. 验证类需要继承abstractvalidator<t> 如:changepasswordmodelvalidation : abstractvalidator
    3. 在构造函数中写验证规则
    4. rulefor()是为当前实体的某一个属性添加验证,如:rulefor(x => x.id).notnull().greaterthan(0) 就是验证这个实体的id 这个字段不能为空,而且必须大于0.后面的withmessage 就是如果前面校验失败就返回的错误信息
    5. 如果要添加自定义的验证,如:判断新密码是否与旧密码一致,这里就先定义这个校验方法,如:newnotequalsold 这个方法我们自定义的,然后再rulefor().must(newnotequalsold) 即可应用
  5. 在我们的修改密码功能提交的时候应用我们的验证,只需要正常的使用即可,如:

    .NET Core中的验证组件FluentValidation的实战分享

    如上所示,该怎么用还怎么用,然后再继续模型校验的时候会自动应用我们的规则。如果我们定义的规则校验失败的话,这时候modelstate.isvalid 会返回false 这时候我们就可以把错误信息通过我们在basecontroller 中自定义的toerrorstring(modelstate,"||"); 方法打印出来。

功能验证

这里我们先把前台的验证规则都给去掉,然后我们刚开始设计的几个规则的校验吧!

密码强度验证

这里我们简单的继续密码长度的校验,如长度满足在:4-32位 ,我们对应的fluentvalidation 的验证规则为rulefor(x => x.oldpassword).notempty().length(4, 32) 这里还进行了非空的校验。如下图所示:

.NET Core中的验证组件FluentValidation的实战分享

旧密码是否跟数据库中的一样

这个校验我是在密码提交后进行的校验,没有放在fluentvalidation中,所以这块只展示测试效果图吧

.NET Core中的验证组件FluentValidation的实战分享

新密码不能跟旧密码一样

这部分我们对应的fluentvalidation中的验证规则是:新增自定义方法,然后调用rulefor().must(newnotequalsold).withmessage("新密码不能跟旧密码一样")
效果如下所示:

.NET Core中的验证组件FluentValidation的实战分享

重复密码需要跟新密码一样

这部分我们对应的fluentvalidation中的验证规则是:新增自定义方法,然后调用rulefor().must(reequalsnew).withmessage("重复密码必须跟新密码一样")
效果如下所示:

当前页面用户必须登录,用户id必须大于0

这部分我们对应的fluentvalidation中的验证规则是:rulefor()..notnull().greaterthan(0)
效果如下所示:

.NET Core中的验证组件FluentValidation的实战分享

源码地址

这个系列教程的源码我会开放在github以及码云上,有兴趣的朋友可以下载查看!觉得不错的欢迎star
github:https://github.com/yilezhu/czar.cms
码云:https://gitee.com/yilezhu/czar.cms
如果你觉得这个系列对您有所帮助的话,欢迎以各种方式进行赞助,当然给个star支持下也是可以滴!另外一种最简单粗暴的方式就是下面这种直接关注我们的公众号了:

.NET Core中的验证组件FluentValidation的实战分享

总结

本篇文章,我通过用户密码修改的实例来为大家详细讲解了fluentvalidation的使用以及注意事项,希望能对大家有所帮助。因为本篇文章使用我们系列教程中的实例,所以本篇文章会收录至系列教程的目录中!本篇文章用了两个番茄时间才完成。