今天有人問我能不能出一篇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 有興趣的朋友可以共同交流技術經驗。
作者:依樂祝
原文地址:https://www.cnblogs.com/yilezhu/p/10397393.html
寫在前面
開始之前還是有必要為大家科普一下FluentValidation的概念,它是一個非常流行的用來構建強類型驗證規則的.NET庫。而且它對ASP.NETCore支持十分友好,可以很方便的進行集成使用,集成後我們可以很方便的對數據模型進行強驗證。
另外附上GitHub地址:https://github.com/JeremySkinner/FluentValidation 有近四千多的Star說明受眾還是挺多的
官方文檔:https://fluentvalidation.net/
為什麼要使用它呢?
因為它足夠簡單,而且功能強大,可以很方便的來為我們建立起強大的實體驗證功能!另外社區也挺活躍,作者也在持續維護中。那麼怎麼使用它呢?下麵我們就通過修改密碼的實例來進行講解!
FluentValidation使用
開始使用之前我們先構思一下密碼修改需要進行的驗證規則:
- 密碼強度驗證
- 舊密碼是否跟資料庫中的一樣
- 新密碼不能跟舊密碼一樣
- 重覆密碼需要跟新密碼一樣
- 當前頁面用戶必須登錄,用戶ID必須大於0
好了,假設我們需要實現上述的功能驗證,怎麼來進行實現呢?當然我們可以通過.net core中的DataAnnoations 進行實現,但是今天我們要使用FluentValidation來實現一番。下麵是具體步驟!
使用
首先當然是添加
FluentValidation.AspNetCore
Nuget包了:Install-Package FluentValidation.AspNetCore
安裝後,需要在應用程式的
Startup
中的ConfigureServices
方法中調用AddFluentValidation
內的擴展方法。(這裡需要using FluentValidation.AspNetCore
),需要註意的是這個擴展方法必須在調用AddMvc
之後進行調用。如下所示:註意:
AddFluentValidation方法必須在AddMvc之後進行調用
我在AddFluentValidation中加入了兩個配置,都有註釋你應該能看懂。
下麵根據我們步驟開始之前的分析創建如下的修改密碼的視圖模型
/** *┌──────────────────────────────────────────────────────────────┐ *│ 描 述:修改密碼實體 *│ 作 者: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; } } }
為這個視圖模型創建一個校驗類,用來添加我們上面列出來的校驗規則,如下所示:
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; } } }
註:上述代碼應該很好理解吧,為了防止有初學者,所以這裡再廢話一下:
- 為每個需要驗證的實體創建一個這樣的類,如我們要驗證的實體是
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
的使用以及註意事項,希望能對大家有所幫助。因為本篇文章使用我們系列教程中的實例,所以本篇文章會收錄至系列教程的目錄中!本篇文章用了兩個番茄時間才完成。