.NET Core中的驗證組件FluentValidation的實戰分享

来源:https://www.cnblogs.com/yilezhu/archive/2019/02/19/10397393.html
-Advertisement-
Play Games

今天有人問我能不能出一篇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來實現一番。下麵是具體步驟!

使用

  1. 首先當然是添加FluentValidation.AspNetCore Nuget包了:

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

    1550485204696

    註意:

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

    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的使用以及註意事項,希望能對大家有所幫助。因為本篇文章使用我們系列教程中的實例,所以本篇文章會收錄至系列教程的目錄中!本篇文章用了兩個番茄時間才完成。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每個節點只存儲單個數字。將兩數相加返回一個新的鏈表。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示例: 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 4 ...
  • 官網文檔鏈接: https://docs.python.org/3/library/os.path.html 概念: 該模塊在路徑名上實現了一些有用的功能,主要用於文件的屬性獲取 代碼實現: os.path.abspath(path) 返迴路徑名路徑的規範化絕對化版本 os.path.basenam ...
  • 1 package com.zlh; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Iterator; 6 import java.util.Map; 7 import java.util... ...
  • logging模塊: logging是一個日誌記錄模塊,可以記錄我們日常的操作。 logging日誌文件寫入預設是gbk編碼格式的,所以在查看時需要使用gbk的解碼方式打開。 logging日誌等級:CRITICAL(50) > ERROR(40) > WARNING(30) > INFO(20) ...
  • 新聞 "Visual Studio 2019預覽版3,F 性能修複" "Bolero 0.3發佈,HTML模版熱載入" "Fantomas線上升級至Fantomas 2.9.2" "使用F 開發的隨機訪問Excel的簡易DSL" "Visual Studio 2019開啟活動" "Benchmark ...
  • 後臺開發知識點 面面俱到很難,一個領域鑽研的很深也很難。我認識的大神里有把C++語言吃的非常透的,也有實驗室就是搞分散式的,拿offer都非常輕鬆。 博客(C++後臺/基礎架構) http://www.linya.pub/ web伺服器開發 直接看muduo的代碼去學習吧,但你可以看看我markdo ...
  • 在JAVA發展過程中,涌現出一系列的ORM框架,JPA,Hibernate,Mybatis和Spring jdbc,本系列,將來研究Mybatis。 通過研究mybatis源碼,可將mybatis的大致架構總結為下圖: 1.根據Mybatis源碼,將其抽象為三層:基礎支持層,核心處理層和介面層 2. ...
  • 7 1 列印沙漏 本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“ ”,要求按下列格式列印 所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。 給定任意N個符號,不一定能正好組成一個沙漏。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...