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

今天有人问我能不能出一篇FluentValidation的教程,恰好今天在实现咱们的.NET Core实战项目之CMS的修改密码部分的功能中有用到FluentValidation,因此就以修改用户密码为实例来为你们进行一下ASP.NET Core中的验证组件FluentValidation的实战分享,但愿能对你们有所帮助!因为本文以.NET Core实战项目之CMS中的项目为例,所以此篇文章会收录到系列教程的目录中。html

本篇文章已经收归入《.NET Core实战项目之CMS 第一章 入门篇-开篇及整体规划》另附上.NET Core实战项目交流群:637326624 有兴趣的朋友能够共同交流技术经验。
做者:依乐祝
原文地址:http://www.javashuo.com/article/p-atagakah-ew.htmlgit

写在前面

开始以前仍是有必要为你们科普一下FluentValidation的概念,它是一个很是流行的用来构建强类型验证规则的.NET库。并且它对ASP.NETCore支持十分友好,能够很方便的进行集成使用,集成后咱们能够很方便的对数据模型进行强验证。
另外附上GitHub地址:https://github.com/JeremySkinner/FluentValidation 有近四千多的Star说明受众仍是挺多的
官方文档:https://fluentvalidation.net/
为何要使用它呢?
由于它足够简单,并且功能强大,能够很方便的来为咱们创建起强大的实体验证功能!另外社区也挺活跃,做者也在持续维护中。那么怎么使用它呢?下面咱们就经过修改密码的实例来进行讲解!github

FluentValidation使用

开始使用以前咱们先构思一下密码修改须要进行的验证规则:数据库

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

好了,假设咱们须要实现上述的功能验证,怎么来进行实现呢?固然咱们能够经过.net core中的DataAnnoations 进行实现,可是今天咱们要使用FluentValidation来实现一番。下面是具体步骤!c#

使用

  1. 首先固然是添加FluentValidation.AspNetCore Nuget包了:函数

    Install-Package FluentValidation.AspNetCore
  2. 安装后,须要在应用程序的Startup中的ConfigureServices方法中调用AddFluentValidation内的扩展方法。(这里须要using FluentValidation.AspNetCore),须要注意的是这个扩展方法必须在调用AddMvc 以后进行调用。以下所示:测试

    1550485204696

    注意:spa

    1. AddFluentValidation方法必须在AddMvc以后进行调用.net

    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. 在咱们的修改密码功能提交的时候应用咱们的验证,只须要正常的使用便可,如:

    1550487024704

    如上所示,该怎么用还怎么用,而后再继续模型校验的时候会自动应用咱们的规则。若是咱们定义的规则校验失败的话,这时候ModelState.IsValid 会返回false 这时候咱们就能够把错误信息经过咱们在BaseController 中自定义的ToErrorString(ModelState,"||"); 方法打印出来。

功能验证

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

密码强度验证

这里咱们简单的继续密码长度的校验,如长度知足在:4-32位 ,咱们对应的FluentValidation 的验证规则为RuleFor(x => x.OldPassword).NotEmpty().Length(4, 32) 这里还进行了非空的校验。以下图所示:

1550487595306

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

这个校验我是在密码提交后进行的校验,没有放在FluentValidation中,因此这块只展现测试效果图吧

1550487708209

新密码不能跟旧密码同样

这部分咱们对应的FluentValidation中的验证规则是:新增自定义方法,而后调用RuleFor().Must(NewNotEqualsOld).WithMessage("新密码不能跟旧密码同样")
效果以下所示:

1550487850978

重复密码须要跟新密码同样

这部分咱们对应的FluentValidation中的验证规则是:新增自定义方法,而后调用RuleFor().Must(ReEqualsNew).WithMessage("重复密码必须跟新密码同样")
效果以下所示:

当前页面用户必须登陆,用户ID必须大于0

这部分咱们对应的FluentValidation中的验证规则是:RuleFor()..NotNull().GreaterThan(0)
效果以下所示:

1550488194952

源码地址

这个系列教程的源码我会开放在GitHub以及码云上,有兴趣的朋友能够下载查看!以为不错的欢迎Star
GitHub:https://github.com/yilezhu/Czar.Cms
码云:https://gitee.com/yilezhu/Czar.Cms
若是你以为这个系列对您有所帮助的话,欢迎以各类方式进行赞助,固然给个Star支持下也是能够滴!另一种最简单粗暴的方式就是下面这种直接关注咱们的公众号了:

img

总结

本篇文章,我经过用户密码修改的实例来为你们详细讲解了FluentValidation的使用以及注意事项,但愿能对你们有所帮助。由于本篇文章使用咱们系列教程中的实例,因此本篇文章会收录至系列教程的目录中!本篇文章用了两个番茄时间才完成。

相关文章
相关标签/搜索