- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) > ASP >
- 在.NET Core 中使用 FluentValidation 進(jìn)行規則驗證的方
不用說(shuō),規則驗證很重要,無(wú)效的參數,可能會(huì )導致程序的異常。
如果使用Web API或MVC頁(yè)面,那么可能習慣了自帶的規則驗證,我們的控制器很干凈:
public class User { [Required] public string FirstName { get; set; } [Required] public string LastName { get; set; } }
這種很常見(jiàn),但是今天我想給你一個(gè)更好的替代方案:FluentValidation, 通過(guò)這個(gè)庫,您可以流暢地定義用于對象驗證的復雜規則,從而輕松構建和理解驗證規則,您可以在 上找到這個(gè)項目。
我新建了一個(gè)很簡(jiǎn)單的.NET Core 的Web API 程序,只有一個(gè)接口是用戶(hù)注冊,入參是一個(gè)User類(lèi), 然后在Nuget中安裝 FluentValidation
。
創(chuàng )建第一個(gè)驗證
對于要驗證的每個(gè)類(lèi),必須創(chuàng )建其自己的驗證器,每個(gè)驗證器類(lèi)都必須繼承AbstractValidator<T>
,其中T是要驗證的類(lèi),并且所有驗證規則都在構造函數中定義。
最簡(jiǎn)單的驗證是針對空值,如果要指定FirstName和LastName都不能為空,這個(gè)驗證器是這樣:
public class UserValidator : AbstractValidator<User> { public UserValidator() { RuleFor(x => x.FirstName).NotEmpty(); RuleFor(x => x.LastName).NotEmpty(); } }
就這些了,您已經(jīng)創(chuàng )建了第一個(gè)驗證器,是不是超級簡(jiǎn)單!
還有一些其他的規則,比如 MinimumLength,MaximumLength和Length,用于驗證長(cháng)度,您可以把多個(gè)規則指定到一個(gè)字段,就像這樣:
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(); } }
我們之前已經(jīng)定義了驗證規則,現在開(kāi)始使用它,您只需要new 一個(gè)UserValidator對象,然后調用Validate方法, 它會(huì )返回一個(gè)對象,其中包含了驗證狀態(tài)和所有沒(méi)有通過(guò)驗證的信息。
[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(); }
如果我運行程序,然后輸入一個(gè)超長(cháng)的名字:
{ "FirstName": "趙錢(qián)孫李周吳鄭王馮陳褚衛蔣沈韓楊朱秦尤許何呂施張", "LastName": "張" }
我會(huì )收到驗證錯誤:"The length of 'First Name' must be 20 characters or fewer. You entered 24 characters"。
好吧,我不喜歡這個(gè)消息,那么你可以自定義錯誤消息,這很簡(jiǎn)單,您可以使用 WithMessage 方法。
- RuleFor(x => x.FirstName).MaximumLength(20); + RuleFor(x => x.FirstName).MaximumLength(20).WithMessage("您的名字長(cháng)度已經(jīng)超出了限制!");
你可以把驗證規則,改成下邊這樣:
- 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("您的名字長(cháng)度已經(jīng)超出了限制!") .NotEmpty().MinimumLength(3); RuleFor(x => x.LastName).NotEmpty(); }
這個(gè)庫有很多現成的基本類(lèi)型驗證規則, 對于字符串,您可以使用不同的方法,比如 EmailAddress,IsEnumName(檢查值是否在指定的Enum類(lèi)型中定義)和 InclusiveBetween, 檢查該值是否在定義的范圍內。
現在,我在User類(lèi)添加了另外兩個(gè)字段,Password 和 ConfirmPassword。
Password字段是一個(gè)字符串,有效的長(cháng)度必須在5到15個(gè)字符之間,并且要符合正則,為了定義是否滿(mǎn)足安全規則,我定義了一個(gè)HasValidPassword方法,它會(huì )返回一個(gè)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("您的名字長(cháng)度已經(jīng)超出了限制!") .NotEmpty().MinimumLength(3); RuleFor(x => x.LastName).NotEmpty(); RuleFor(x => x.Password) .Length(5, 15) .Must(x => HasValidPassword(x));
還可以簡(jiǎn)化一些:
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類(lèi)中的ConfigureServices方法:
public void ConfigureServices(IServiceCollection services) { services.AddControllers().AddFluentValidation(); services.AddTransient<IValidator<User>, UserValidator>(); }
注意:這個(gè)地方的生命周期是 Transient。
這樣,在調用注冊接口的時(shí)候,會(huì )自動(dòng)進(jìn)行規則驗證:
[HttpPost] public IActionResult Register(User newUser) { return Ok(); }
然后,我們再?lài)L試傳入參數來(lái)調用接口:
{ "FirstName": "趙錢(qián)孫李周吳鄭王馮陳褚衛蔣沈韓楊朱秦尤許何呂施張", "LastName": "張" }
很明顯,驗證不通過(guò),接口會(huì )返回這樣的錯誤信息:
{ "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": [ "您的名字長(cháng)度已經(jīng)超出了限制!" ] } }
希望對您有幫助,您可以在官方文檔中找到更多的用法。
原文鏈接:
到此這篇關(guān)于在.NET Core 中使用 FluentValidation 進(jìn)行規則驗證的文章就介紹到這了,更多相關(guān).NET Core 規則驗證內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站