.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的使用以及注意事項,但願能對你們有所幫助。由於本篇文章使用咱們系列教程中的實例,因此本篇文章會收錄至系列教程的目錄中!本篇文章用了兩個番茄時間才完成。

相關文章
相關標籤/搜索