1. 程式人生 > 實用技巧 >Dotnet Core FluentValidation

Dotnet Core FluentValidation

FluentValidation使用

開始使用之前我們先構思一下密碼修改需要進行的驗證規則:

  • 密碼強度驗證
  • 舊密碼是否跟資料庫中的一樣
  • 新密碼不能跟舊密碼一樣
  • 重複密碼需要跟新密碼一樣
  • 當前頁面使用者必須登入,使用者ID必須大於0

好了,假設我們需要實現上述的功能驗證,怎麼來進行實現呢?當然我們可以通過.net core中的DataAnnoations 進行實現,但是今天我們要使用FluentValidation來實現一番。下面是具體步驟!

使用

  1. 首先當然是新增FluentValidation.AspNetCore Nuget包了:

    Install-Package FluentValidation.AspNetCore
    
  2. 安裝後,需要在應用程式的Startup中的ConfigureServices方法中呼叫AddFluentValidation內的擴充套件方法。(這裡需要using FluentValidation.AspNetCore),需要注意的是這個擴充套件方法必須在呼叫AddMvc 之後進行呼叫。如下所示:

    注意:

    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. 在我們的修改密碼功能提交的時候應用我們的驗證,只需要正常的使用即可,如:

    如上所示,該怎麼用還怎麼用,然後再繼續模型校驗的時候會自動應用我們的規則。如果我們定義的規則校驗失敗的話,這時候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)
效果如下所示: