1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

    在.NET Core 中使用 FluentValidation 進行規則驗證的方法_應用技巧

    來源:腳本之家  責任編輯:小易  

    不用說,規則驗證很重要,無效的參數,可能會導致程序的異常。

    如果使用Web API或MVC頁面,那么可能習慣了自帶的規則驗證,我們的控制器很干凈:

    public class User
    {
    	[Required]
    	public string FirstName { get; set; }
    	
    	[Required]
    	public string LastName { get; set; }
    }

    這種很常見,但是今天我想給你一個更好的替代方案:FluentValidation, 通過這個庫,您可以流暢地定義用于對象驗證的復雜規則,從而輕松構建和理解驗證規則,您可以在 Github 上找到這個項目。

    安裝 FluentValidation

    我新建了一個很簡單的.NET Core 的Web API 程序,只有一個接口是用戶注冊,入參是一個User類, 然后在Nuget中安裝 FluentValidation

    創建第一個驗證

    對于要驗證的每個類,必須創建其自己的驗證器,每個驗證器類都必須繼承AbstractValidator<T>,其中T是要驗證的類,并且所有驗證規則都在構造函數中定義。

    最簡單的驗證是針對空值,如果要指定FirstName和LastName都不能為空,這個驗證器是這樣:

    public class UserValidator : AbstractValidator<User>
    {
    	public UserValidator()
    	{
    		RuleFor(x => x.FirstName).NotEmpty();
    		RuleFor(x => x.LastName).NotEmpty();
    	}
    }

    就這些了,您已經創建了第一個驗證器,是不是超級簡單!

    還有一些其他的規則,比如 MinimumLength,MaximumLength和Length,用于驗證長度,您可以把多個規則指定到一個字段,就像這樣:

    public class UserValidator : AbstractValidator<User>
    {
    	public UserValidator()
    	{
    		RuleFor(x => x.FirstName).NotEmpty();
    		RuleFor(x => x.FirstName).MinimumLength(3);
        RuleFor(x => x.FirstName).MaximumLength(20);
    		
    		RuleFor(x => x.LastName).NotEmpty();
    	}
    }

    驗證入參

    我們之前已經定義了驗證規則,現在開始使用它,您只需要new 一個UserValidator對象,然后調用Validate方法, 它會返回一個對象,其中包含了驗證狀態和所有沒有通過驗證的信息。

    [HttpPost]
    public IActionResult Register(User newUser)
    {
    	var validator = new UserValidator();
    	var validationResult = validator.Validate(newUser);
    	
    	if (!validationResult.IsValid)
    	{
    		return BadRequest(validationResult.Errors.First().ErrorMessage);
    	}
    
    	return Ok();
    }

    如果我運行程序,然后輸入一個超長的名字:

    {
      "FirstName": "趙錢孫李周吳鄭王馮陳褚衛蔣沈韓楊朱秦尤許何呂施張",
      "LastName": "張"
    }

    我會收到驗證錯誤:"The length of 'First Name' must be 20 characters or fewer. You entered 24 characters"。

    好吧,我不喜歡這個消息,那么你可以自定義錯誤消息,這很簡單,您可以使用 WithMessage 方法。

    - RuleFor(x => x.FirstName).MaximumLength(20);
    + RuleFor(x => x.FirstName).MaximumLength(20).WithMessage("您的名字長度已經超出了限制!");

    流利驗證

    你可以把驗證規則,改成下邊這樣:

    - RuleFor(x => x.FirstName).NotEmpty();
    - RuleFor(x => x.FirstName).MinimumLength(3);
    + RuleFor(x => x.FirstName).NotEmpty().MinimumLength(3);

    然后也可以把驗證規則應用于其他的屬性,就像這樣:

    public UserValidator()
    {
    	RuleFor(x => x.FirstName)
    		.MaximumLength(20).WithMessage("您的名字長度已經超出了限制!")
    		.NotEmpty().MinimumLength(3);
    
    	RuleFor(x => x.LastName).NotEmpty();
    }

    常見的驗證規則

    這個庫有很多現成的基本類型驗證規則, 對于字符串,您可以使用不同的方法,比如 EmailAddress,IsEnumName(檢查值是否在指定的Enum類型中定義)和 InclusiveBetween, 檢查該值是否在定義的范圍內。

    現在,我在User類添加了另外兩個字段,Password 和 ConfirmPassword。

    Password字段是一個字符串,有效的長度必須在5到15個字符之間,并且要符合正則,為了定義是否滿足安全規則,我定義了一個HasValidPassword方法,它會返回一個bool值。

    private bool HasValidPassword(string pw)
    {
    	var lowercase = new Regex("[a-z]+");
    	var uppercase = new Regex("[A-Z]+");
    	var digit = new Regex("(\\d)+");
    	var symbol = new Regex("(\\W)+");
    
    	return (lowercase.IsMatch(pw) && uppercase.IsMatch(pw) && digit.IsMatch(pw) && symbol.IsMatch(pw));
    }

    然后在密碼驗證中使用:

    RuleFor(x => x.FirstName)
    	.MaximumLength(20).WithMessage("您的名字長度已經超出了限制!")
    	.NotEmpty().MinimumLength(3);
    
    RuleFor(x => x.LastName).NotEmpty();
    
    RuleFor(x => x.Password)
    	.Length(5, 15)
    	.Must(x => HasValidPassword(x));

    還可以簡化一些:

    RuleFor(x => x.Password)
    			.Length(5, 15)
    -			.Must(x => HasValidPassword(x));
    +			.Must(HasValidPassword);
    	}

    ConfirmPassword字段的唯一要求是等于Password字段:

    RuleFor(x => x.ConfirmPassword)
    	.Equal(x => x.Password)
    	.WithMessage("2次密碼不一致!");

    注入驗證器

    修改Startup類中的ConfigureServices方法:

    public void ConfigureServices(IServiceCollection services)
    {
    	services.AddControllers().AddFluentValidation();
    
    	services.AddTransient<IValidator<User>, UserValidator>();
    }

    注意:這個地方的生命周期是 Transient。

    這樣,在調用注冊接口的時候,會自動進行規則驗證:

    [HttpPost]
    public IActionResult Register(User newUser)
    {
    	return Ok();
    }

    然后,我們再嘗試傳入參數來調用接口:

    {
      "FirstName": "趙錢孫李周吳鄭王馮陳褚衛蔣沈韓楊朱秦尤許何呂施張",
      "LastName": "張"
    }

    很明顯,驗證不通過,接口會返回這樣的錯誤信息:

    {
      "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
      "title": "One or more validation errors occurred.",
      "status": 400,
      "traceId": "|c4523c02-4899b7f3df86a629.",
      "errors": { 
        "FirstName": [
          "您的名字長度已經超出了限制!"
        ]
      }
    }

    希望對您有幫助,您可以在官方文檔中找到更多的用法。

    原文鏈接: https://www.code4it.dev/blog/fluentvalidation

    到此這篇關于在.NET Core 中使用 FluentValidation 進行規則驗證的文章就介紹到這了,更多相關.NET Core 規則驗證內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

    您可能感興趣的文章:.Net Core3.0 WEB API中使用FluentValidation驗證(批量注入)ASP.NET Core WebApi中使用FluentValidation驗證數據模型的方法ASP.NET Core使用自定義驗證屬性控制訪問權限詳解Asp.Net Core中基于Session的身份驗證的實現.NET Core 2.0如何生成圖片驗證碼完整實例

  3. 本文相關:
  4. asp get和post數據接收過濾
  5. asp vbs 代碼大小寫規范
  6. asp取日期1月25日為0125的最簡單方法
  7. asp fso文件處理函數大全
  8. 一段asp 偽靜態代碼
  9. asp取動態表單中數據并寫入xml文件,用xsl顯示
  10. 多域名綁定到一個空間訪問不同首頁的技巧
  11. asp實現獲取mssql數據庫表指定條件行數的函數
  12. ajax+asp無限級分類樹型結構(帶數據庫)
  13. asp 返回引用類型函數代碼
  14. fluentvalidation mvc5怎么注銷默認驗證
  15. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全asp基礎應用技巧數據庫相關asp class類存儲過程小偷/采集木馬相關fso專題首頁asp編程.net core3.0 web api中使用fluentvalidation驗證(批量注入)asp.net core webapi中使用fluentvalidation驗證數據模型的方法asp.net core使用自定義驗證屬性控制訪問權限詳解asp.net core中基于session的身份驗證的實現.net core 2.0如何生成圖片驗證碼完整實例asp get和post數據接收過濾asp vbs 代碼大小寫規范asp取日期1月25日為0125的最簡單方法asp fso文件處理函數大全一段asp 偽靜態代碼asp取動態表單中數據并寫入xml文件,用xsl顯示多域名綁定到一個空間訪問不同首頁的技巧asp實現獲取mssql數據庫表指定條件行數的函數ajax+asp無限級分類樹型結構(帶數據庫)asp 返回引用類型函數代碼推薦4款傻瓜型的asp服務器軟件(關于“未指定的錯誤”的問題 的比錯誤類型:provider (0x80004005c#入門教程之listbox控件使用方法utf-8 網頁不顯示+utf-8網頁亂碼asp 日期格式化問題asp中設置session過期時間方法總microsoft jet database engine(sql查詢語句通配符與access模糊查asp獲取url參數的幾種方法分析總通過vb6將asp編譯封裝成dll組件最簡教程 aspupload 3.0 下載與使用集錦asp漢字中文圖片驗證碼asp調用遠程xml數據的代碼(alexa排名數據asp下過濾非法的sql字符的函數代碼提高asp頁面執行效率的方法分析asp實現二進制字符串轉換為unicode字符串asp中解決“對象關閉時,不允許操作。”的新增加一個防垃圾評論的asp代碼,鄙視垃圾asp生成不需要數據庫的中獎碼
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载