国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 基于.NET的FluentValidation數(shù)據(jù)驗證實現(xiàn)

基于.NET的FluentValidation數(shù)據(jù)驗證實現(xiàn)

2021-12-06 16:05樹杈 ASP.NET教程

這篇文章主要介紹了基于.NET的FluentValidation數(shù)據(jù)驗證實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

學習地址:官方文檔,更多更詳細的內(nèi)容可以看官方文檔。

FluentValidation 是一個基于 .NET 開發(fā)的驗證框架,開源免費,而且優(yōu)雅,支持鏈式操作,易于理解,功能完善,還是可與 MVC5、WebApi2 和 ASP.NET CORE 深度集成,組件內(nèi)提供十幾種常用驗證器,可擴展性好,支持自定義驗證器,支持本地化多語言。

要使用驗證框架, 需要在項目中添加對 FluentValidation.dll 的引用,支持 netstandard2.0 庫和 .NET4.5 平臺,支持.NET Core 平臺,最簡單的方法是使用 NuGet 包管理器引用組件。我這里安裝的是9.2.0版本。

?
1
Install-Package FluentValidation

若要在 ASP.NET Core 中使用 FluentValidation 擴展,可引用以下包:

?
1
Install-Package FluentValidation.AspNetCore

若要在 ASP.NET MVC 5 或 WebApi 2 項目集成, 可以使用分別使用 FluentValidation.Mvc5 和 FluentValidation.WebApi 程序包。

?
1
2
Install-Package FluentValidation.Mvc5
Install-Package FluentValidation.WebApi

創(chuàng)建第一個驗證程序

若要為特定對象定義一組驗證規(guī)則, 您需要創(chuàng)建一個從 AbstractValidator<T> 繼承的類, 其中泛型T參數(shù)是要驗證的類的類型。假設(shè)您有一個客戶類別:

?
1
2
3
4
5
6
7
public class Customer {
 public int Id { get; set; }
 public string Surname { get; set; }
 public string Forename { get; set; }
 public decimal Discount { get; set; }
 public string Address { get; set; }
}

接下來自定義繼承于 AbstractValidator 泛型類的驗證器,然后在構(gòu)造函數(shù)中使用 LINQ 表達式編寫 RuleFor 驗證規(guī)則,使驗證在。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
using FluentValidation;
using NetCoreBasicLearning.Entity;
 
namespace NetCoreBasicLearning
{
  public class CustomerValidator : AbstractValidator<Customer>
  {
    public CustomerValidator()
    {
      RuleFor(customer => customer.Surname).NotNull();
    }
  }
}

若要執(zhí)行驗證程序,我們通過定義好的 CustomerValidator 驗證器傳入實體類 Customer 即可。

該驗證方法返回一個 ValidationResult 對象,表示驗證結(jié)果,ValidationResult 包含兩個屬性:IsValid屬性是布爾值, 它表示驗證是否成功,Errors屬性包含相關(guān)驗證失敗的詳細信息。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public IActionResult Index(string id)
{
  Customer customer = new Customer();
  CustomerValidator validationRules = new CustomerValidator();
  ValidationResult validationResult = validationRules.Validate(customer);
 
  if (!validationResult.IsValid)
  {
    var str = new StringBuilder();
    foreach(var t in validationResult.Errors)
    {
      str.AppendLine($"屬性:{t.PropertyName},錯誤信息:{t.ErrorMessage}");
    }
    return Content(str.ToString());
  }
  return View();
}

鏈接規(guī)則寫法

您可以將對象的同一屬性用多個驗證程序鏈在一起,以下代碼將驗證 Surname 屬性不為 Null 的同時且不等于foo字符串。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
using FluentValidation;
using NetCoreBasicLearning.Entity;
 
namespace NetCoreBasicLearning
{
  public class CustomerValidator : AbstractValidator<Customer>
  {
    public CustomerValidator()
    {
      RuleFor(customer => customer.Surname).NotNull().NotEqual("foo");
    }
  }
}

引發(fā)異常

如果驗證失敗, 不想返回 ValidationResult 對象,而是想直接拋出異常,可通過調(diào)用驗證器的 ValidateAndThrow 進行驗證。

如果驗證失敗,將引發(fā)一個 ValidationException 類型的異常,這個異??梢员簧蠈映绦虿东@,并從異常中找到詳細錯誤信息。

?
1
2
3
Customer customer = new Customer();
CustomerValidator validationRules = new CustomerValidator();
validationRules.ValidateAndThrow(customer);

集合

當針對一個集合進行驗證時,只需要定義集合項類型的規(guī)則即可,以下規(guī)則將對集合中的每個元素運行 NotNull 檢查。

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Customer
{
  public List<string> OtherAddress { get; set; }
}
 
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    RuleForEach(customer => customer.OtherAddress).NotEmpty();
  }
}

如果要對list進行進行非空判斷可以如下:

?
1
2
3
4
5
6
7
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    RuleFor(customer => customer.OtherAddress).NotEmpty();
  }
}

復雜屬性

驗證程序可以用于復雜屬性,假設(shè)您有兩個類:客戶和地址

?
1
2
3
4
5
6
7
8
9
public class Customer
{
  public Adress Address { get; set; }
}
public class Adress
{
  public string City { get; set; }
  public string Province { get; set; }
}

然后定義一個基于地址的 AddressValidator 驗證器件:

?
1
2
3
4
5
6
7
8
public class AdressValidator : AbstractValidator<Adress>
{
  public AdressValidator()
  {
    RuleFor(t => t.City).NotEmpty();
    RuleFor(t => t.Province).NotEmpty();
  }
}   

然后定義一個基于客戶的 CustomerValidator 驗證器件,對地址驗證時使用地址驗證器。

?
1
2
3
4
5
6
7
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    RuleFor(t => t.Address).SetValidator(new AdressValidator());
  }

如果不想要創(chuàng)建另一個驗證器可以直接內(nèi)聯(lián)定義子規(guī)則:

?
1
RuleFor(t => t.Address.City).NotEmpty();

另外,還可以在集合屬性上使用驗證程序,假設(shè)客戶對象包含地址集合屬性:

?
1
2
3
4
public class Customer
{
  public List<Adress> Address { get; set; }
 }

此驗證程序可在 CustomerValidator 中通過 SetCollectionValidator(在8.0版本以前) 方法使用,在8.0版本以及之后被棄用需要使用RuleForEach來驗證:

?
1
2
3
4
5
6
7
8
public class CustomerValidator : AbstractValidator<Customer>
{
   public CustomerValidator()
  {
    RuleForEach(t => t.Address).SetValidator(new AdressValidator());
    //RuleFor(x => x.Address).SetCollectionValidator(new AdressValidator());在8.0版本及以后棄用
  }
}

在編寫驗證規(guī)則時,可以通過 Where 關(guān)鍵字排除或者篩選不需要驗證的對象。

?
1
2
3
4
5
6
7
8
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    RuleForEach(t => t.Address).Where(t => !string.IsNullOrEmpty(t.City)).SetValidator(new AdressValidator());
    //RuleFor(x => x.Address).SetCollectionValidator(new AdressValidator()).Where(t => !string.IsNullOrEmpty(t.City));在8.0版本及以后棄用
  }

從FluentValidation 8.5開始,您還可以使用以下ChildRules方法在線定義子集合元素的規(guī)則,從而不用再定義另一個驗證器:

?
1
2
3
4
RuleForEach(t => t.Address).ChildRules(adderss => {
  adderss.RuleFor(t => t.City).NotEmpty();
  adderss.RuleFor(t => t.Province).NotEmpty();
}).NotEmpty();

支持規(guī)則集

規(guī)則集允許您將驗證規(guī)則分組在一起,這些規(guī)則可以作為一個組一起執(zhí)行,而忽略其他規(guī)則:

我們可以把“姓”和“名”統(tǒng)一加在一個姓名規(guī)則集中。

?
1
2
3
4
5
6
7
8
9
10
11
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    RuleSet("Name", () =>
    {
      RuleFor(t => t.Surname).NotEmpty();
      RuleFor(t => t.Forename).NotEmpty();
    });
  }
}

規(guī)則集通過一般的 Validate 方法是不會執(zhí)行驗證的,需要用如下方法進行單獨的驗證,這將復雜的驗證器定義分解為較小的部分進行驗證,IncludeRuleSets 中可以傳入多個規(guī)則集名稱來執(zhí)行多個規(guī)則集的驗證:

?
1
2
3
Customer customer = new Customer();
CustomerValidator validationRules = new CustomerValidator();
ValidationResult validationResult = validationRules.Validate(customer, options => options.IncludeRuleSets("Name"));

還可以通過 IncludeRulesNotInRuleSet 方法或使用特殊名稱“默認”(不區(qū)分大小寫)來執(zhí)行驗證所有不屬于規(guī)則集的規(guī)則:

?
1
ValidationResult validationResult = validationRules.Validate(customer, options =>{ options.IncludeRulesNotInRuleSet(); options.IncludeRuleSets("Name"); } );

可以通過調(diào)用強制執(zhí)行所有規(guī)則,而不管它們是否在規(guī)則集中 IncludeAllRuleSets(這等效于using IncludeRuleSets("*"))。

同個類型的多個驗證器

一個驗證器可以包含多個其他的驗證器,只要這些驗證器都是驗證統(tǒng)一類型的即可。這樣就可以拆分驗證器,通過不同的需求組合在一起:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    Include(new CustomerSurnameValidator());
    Include(new CustomerForenameValidator());
  }
}
public class CustomerSurnameValidator : AbstractValidator<Customer>
{
  public CustomerSurnameValidator()
  {
    RuleFor(t => t.Surname).NotEmpty();
  }
}
public class CustomerForenameValidator : AbstractValidator<Customer>
{
  public CustomerForenameValidator()
  {
    RuleFor(t => t.Forename).NotEmpty();
  }
}

繼承驗證

從FluentValidation 9.2開始,如果您的對象屬性作為其他類的基類或接口,則可以為各個子類/實現(xiàn)器設(shè)置特定的子驗證器,來驗證這個屬性。我們的類設(shè)置如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Store
{
  public People Peoples { get; set; }
}
public class Customer : People
{
  public string Address { get; set; }
}
public class People
{
  public string Name { get; set; }
}

驗證器如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class StoreValidator : AbstractValidator<Store>
{
  public StoreValidator()
  {
    RuleFor(t => t.Peoples).NotNull().SetInheritanceValidator(t =>
    {
       t.Add<Customer>(new CustomerValidator());
    });
  }
}
 public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    RuleFor(t => t.Address).NotEmpty();
  }
}

覆蓋消息

通過在驗證程序上調(diào)用 WithMessage 方法, 可以覆蓋驗證程序的默認驗證錯誤消息。錯誤提示中,可以通過 {PropertyName} 占位符替換屬性名。除了 {PropertyName} 占位符,框架還內(nèi)置了:{PropertyValue}、{ComparisonValue}、{MinLength}、{MaxLength}和{TotalLength} 占位符,關(guān)于更多內(nèi)置占位符,可以參閱官方文檔。

?
1
RuleFor(customer => customer.Surname).NotNull().WithMessage("Please ensure you have entered your {PropertyName}");

驗證程序支持通過 WithName 方法來指定屬性別名,以下代碼輸出姓名不能為空。請注意,這僅替換錯誤消息中屬性的名稱。當您檢查上的Errors集合時ValidationResult,此錯誤仍將與一個名為的屬性相關(guān)聯(lián)Surname。如果要完全重命名該屬性,則可以使用OverridePropertyName方法。

?
1
RuleFor(customer => customer.Surname).NotNull().WithName("姓名");

條件

When 和 Unless方法可用于執(zhí)行滿足指定條件情況下的規(guī)則,例如只當Surname屬性不為空的時候,才執(zhí)行前面的Name屬性的非空驗證(Unless和When是相反的所以這邊只講When就行啦?。?/p>

?
1
RuleFor(t => t.Name).NotEmpty().When(t => !string.IsNullOrEmpty(t.Surname));

如果需要指定多個規(guī)則在相同的條件下才執(zhí)行驗證,可以直接用頂級的When方法:

?
1
2
3
4
5
6
7
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    When(t => !string.IsNullOrEmpty(t.Surname), () => { RuleFor(t => t.Name).NotEmpty();//其他驗證規(guī)則 });
  }
}

通過在When方法后面追加一個Otherwise方法,可以執(zhí)行不滿足When中調(diào)整的驗證規(guī)則,如下:

?
1
When(t => !string.IsNullOrEmpty(t.Surname), () => { RuleFor(t => t.Name).NotEmpty(); }).Otherwise(() => { RuleFor(t => t.Name).Equal("哈哈"); });

默認情況下,F(xiàn)luentValidation會將條件應用于對的同一調(diào)用中的所有先前的驗證器RuleFor。比如下面這條代碼,如果Surname不為空,則對Name進行非空和是否等于11的驗證,否則不會對Name執(zhí)行這兩個驗證:

?
1
RuleFor(t => t.Name).NotEmpty().Equal("11").When(t => !string.IsNullOrEmpty(t.Surname));

如果僅希望將條件應用于緊接條件之前的驗證器,則必須明確參數(shù)ApplyConditionTo.CurrentValidator,如下,只有Equal受到When方法的限制,NotEmpty不管When是否為true都會執(zhí)行的。

?
1
RuleFor(t => t.Name).NotEmpty().Equal("11").When(t => !string.IsNullOrEmpty(t.Surname), ApplyConditionTo.CurrentValidator);

設(shè)置級聯(lián)模式

有兩種聯(lián)級模式:

  • Continue (默認設(shè)置)-始終調(diào)用規(guī)則定義中的所有驗證器
  • Stop -驗證程序失敗后立即停止執(zhí)行規(guī)則(僅在FluentValidation 9.1和更高版本中可用,在舊版本中,您可以改用StopOnFirstFailure)

通過如下代碼,可以在NotNull驗證不通過的時候就停止驗證,不再執(zhí)行NotEqual的驗證。默認是驗證不通過,也繼續(xù)驗證下去。

?
1
RuleFor(x => x.Surname).Cascade(CascadeMode.Stop).NotNull().NotEqual("foo");

設(shè)置嚴重性級別

默認情況下,如果這些規(guī)則失敗,則嚴重性為“錯誤”??梢酝ㄟ^調(diào)用WithSeverity方法來更改。例如,如果我們希望將缺少的姓氏標識為警告而不是錯誤,則可以將上面的行修改為:

?
1
RuleFor(x => x.Surname).NotNull().WithSeverity(Severity.Warning);

在9.0及更高版本中,可以改用回調(diào),這也使您可以訪問正在驗證的項目:

?
1
RuleFor(person => person.Surname).NotNull().WithSeverity(person => Severity.Warning);

定制驗證器

之前我們都是使用內(nèi)置的驗證器,如Equal、NotNull等等。

我們也可以自己定義驗證器,實現(xiàn)自定義驗證器的最簡單方法是使用Must方法,該方法在內(nèi)部使用PredicateValidator。假設(shè)我們有以下課程:

?
1
2
3
public class Person {
 public IList<Pet> Pets {get;set;} = new List<Pet>();
}

為了確保我們的list屬性包含少于10個項目,我們可以這樣做:

?
1
2
3
4
5
6
public class PersonValidator : AbstractValidator<Person> {
 public PersonValidator() {
  RuleFor(x => x.Pets).Must(list => list.Count < 10)
   .WithMessage("The list must contain fewer than 10 items");
 }
}

為了使我們自己定義的驗證器可以重用,我們可以將其包裝為可作用于任何List<T>類型的擴展方法。

?
1
2
3
4
5
public static class MyCustomValidators {
 public static IRuleBuilderOptions<T, IList<TElement>> ListMustContainFewerThan<T, TElement>(this IRuleBuilder<T, IList<TElement>> ruleBuilder, int num) {
  return ruleBuilder.Must(list => list.Count < num).WithMessage("The list contains too many items");
 }
}

在這里,我們在上創(chuàng)建一個擴展方法IRuleBuilder<T,TProperty>,并使用通用類型約束來確保此方法僅出現(xiàn)在對列表類型的智能感知中。在方法內(nèi)部,我們以與以前相同的方式調(diào)用Must方法,但是這次我們在傳入的RuleBuilder實例上調(diào)用它。我們還將要比較的項目數(shù)作為參數(shù)傳遞?,F(xiàn)在,我們的規(guī)則定義可以重寫為使用以下方法:

?
1
RuleFor(x => x.Pets).ListMustContainFewerThan(10);

我們還可以通過Custom方法來自定義驗證器,它相比于Must的好處是允許針對同一規(guī)則返回多個錯誤(通過context.AddFailure多次調(diào)用該方法)。

?
1
2
3
4
5
6
7
8
9
public class PersonValidator : AbstractValidator<Person> {
 public PersonValidator() {
  RuleFor(x => x.Pets).Custom((list, context) => {
   if(list.Count > 10) {
    context.AddFailure("The list must contain 10 items or fewer");
   }
  });
 }
}

到此這篇關(guān)于基于.NET的FluentValidation數(shù)據(jù)驗證實現(xiàn)的文章就介紹到這了,更多相關(guān).NET FluentValidation數(shù)據(jù)驗證內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/xwc1996/p/13956031.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩三级网 | 午夜成人在线视频 | 亚洲人成网站b2k3cm | 国产精品一区一区三区 | 伦理自拍 | 亚洲欧美日韩国产综合精品二区 | 精品一区二区三区中文字幕 | 久草热8精品视频在线观看 欧美黄色小视频 | 曰本人一级毛片免费完整视频 | 国产馆| 91在线视频播放 | 久久综合久 | 日韩av一区二区在线观看 | 亚洲色图 偷拍自拍 | 中文字幕免费播放 | 99精品网站 | 中文字幕视频二区 | 国产综合精品一区二区三区 | 夜夜骑av| 欧美一级在线视频 | 国产欧美日韩一区二区三区 | 国产精品国产精品国产专区不卡 | 国产欧美视频一区二区三区 | 欧美精品成人一区二区在线 | 亚洲成av人片一区二区梦乃 | 在线中文av | 精品久久久久香蕉网 | 一级黄色片网站 | 精品久久久久久久人人人人传媒 | 秋霞av电影| 欧美成年黄网站色视频 | 少妇精品久久久久久久久久 | 久久久久一区 | 九九久久精品 | 中文字幕久久精品 | 伊人热久久婷婷 | 国产九九九 | 亚洲欧美日韩电影 | 在线观看毛片网站 | 依人久久久 | 欧美日韩一区二 |