欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET全棧開(kāi)發(fā)教程之前后臺(tái)校驗(yàn)結(jié)合詳解

 更新時(shí)間:2018年07月22日 14:39:11   作者:Gxqsd  
這篇文章主要給大家介紹了關(guān)于ASP.NET全棧開(kāi)發(fā)教程之前后臺(tái)校驗(yàn)結(jié)合的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在Web系統(tǒng)開(kāi)發(fā)時(shí),往往會(huì)有存在大量的交互操作,交互就必須校驗(yàn)數(shù)據(jù)的準(zhǔn)確性啊,且不說(shuō)一個(gè)字段可能存在多種校驗(yàn),若一個(gè)表單提交有10個(gè)字段難道我們要對(duì)這10個(gè)字段分別寫(xiě)代碼去校驗(yàn)嗎?如果是這樣,那每一個(gè)表單都要單獨(dú)去寫(xiě)一份校驗(yàn)豈不是太痛苦了?

為了解決這個(gè)問(wèn)題,聰明的程序員們開(kāi)始了“偷懶”!

今天我們介紹一位在.NET平臺(tái)下偷懶的——“FluentValidation”,正如其名,流利的驗(yàn)證,他將我們的驗(yàn)證開(kāi)發(fā)工作變得流利甚至優(yōu)美了起來(lái)。

接下來(lái)我們就來(lái)看看如何使用它吧。

首先我們使用nuget安裝 FluentValidation

Nuget安裝命令:Install-Package FluentValidation -Version 7.6.104

由于FluentValidation的驗(yàn)證是基于模型的,所以,我們先來(lái)建立一個(gè)Person

public class Person
 {
  /// <summary>
  /// 姓名
  /// </summary>
  public string Name { get; set; }
  /// <summary>
  /// 年齡
  /// </summary>
  public int Age { get; set; }
  /// <summary>
  /// 性別
  /// </summary>
  public bool Sex { get; set; }

 }

有了模型,要想驗(yàn)證模型,肯定得有驗(yàn)證器才行,于是我們?cè)趧?chuàng)建一個(gè)Person的驗(yàn)證器

public class PersonValidator : AbstractValidator<Person>
 {
  public PersonValidator()
  {
   this.RuleFor(p => p.Name)
    .NotEmpty()
    .WithMessage("名字不能為空");
   this.RuleFor(p => p.Age)
    .NotEmpty()
    .WithMessage("年齡不能為空!!");
  }
 }

驗(yàn)證器必須繼承自AbstractValidator<T> ,泛型T表示該驗(yàn)證器驗(yàn)證的實(shí)體,在構(gòu)造函數(shù)里通過(guò)this.RuleFor為指定的屬性設(shè)置驗(yàn)證,在上述配置中為Person的Name和Age屬性都設(shè)置了非空,并且給出了相應(yīng)的錯(cuò)誤消息。

現(xiàn)在實(shí)體有了,驗(yàn)證器也有了,就差東風(fēng)了。

class Program
 {
  static void Main(string[] args)
  {
   Server(new Person { });

   Console.ReadKey(true);
  }

  private static void Server(Person model)
  {
   var validator = new PersonValidator();

   ValidationResult result = validator.Validate(model);
   if (!result.IsValid)
   {
    foreach (var failure in result.Errors)
    {
     //失敗的屬性名稱,如錯(cuò)誤信息
     Console.WriteLine("Property " + failure.PropertyName + " failed validation. Error was: " + failure.ErrorMessage);
    }
   }
   Console.WriteLine("驗(yàn)證完成!!");
  }
 }

在Server方法中需要一個(gè)參數(shù)Person,Person是個(gè)對(duì)象,里面有3個(gè)屬性Name、Age、Sex,在Server內(nèi)部我們創(chuàng)建了一個(gè)Person驗(yàn)證器對(duì)象,用它來(lái)驗(yàn)證我們的參數(shù)model,  驗(yàn)證后會(huì)返回一個(gè)驗(yàn)證結(jié)果。這個(gè)結(jié)果有2個(gè)重要的參數(shù),第一是IsValid,驗(yàn)證通過(guò)的時(shí)候返回True,第二個(gè)是Errors,他里面存放的是所有驗(yàn)證失敗的信息,在驗(yàn)證失敗的時(shí)候通過(guò)遍歷Errors即可獲取到所有錯(cuò)誤信息,如上所示通過(guò)錯(cuò)誤信息的PropertyName就能知道是哪個(gè)對(duì)象出錯(cuò)了,而ErrorMessage自然就對(duì)應(yīng)這個(gè)Property所出錯(cuò)內(nèi)容的WithMessage了。下面是運(yùn)行結(jié)果

 

至此,我們能夠使用基本驗(yàn)證了。

但在我們實(shí)際應(yīng)用中不一定會(huì)像上述案例一樣一帆風(fēng)順,也許我們的Person里會(huì)有一個(gè)Address屬性,他的類(lèi)型不是一個(gè)String,而是一個(gè)對(duì)象Address,如下所示

public class Person
 {
  /// <summary>
  /// 姓名
  /// </summary>
  public string Name { get; set; }
  /// <summary>
  /// 年齡
  /// </summary>
  public int Age { get; set; }
  /// <summary>
  /// 性別
  /// </summary>
  public bool Sex { get; set; }

  /// <summary>
  /// 地址
  /// </summary>
  public Address Address { get; set; }
 }
public class Address
 {
  /// <summary>
  /// 家庭地址
  /// </summary>
  public string Home { get; set; }

  /// <summary>
  /// 家庭電話
  /// </summary>
  public string Phone { get; set; }
 }

假如Address也有一個(gè)驗(yàn)證器

public class AddressValidator : AbstractValidator<Address>
 {
  public AddressValidator()
  {
   this.RuleFor(m => m.Home)
    .NotEmpty()
    .WithMessage("家庭住址不能為空");

   this.RuleFor(m => m.Phone)
    .Length(11, 12)
    .WithMessage("電話必須是11-12位之間");
  }
 }

現(xiàn)在需求變了,在Person實(shí)體的要求里不僅要求Name、Age不能為空,并且還要求Address下的Home和Phone滿足AddressValidator的要求,這可怎么辦呢?

當(dāng)然你可以像這樣做

public class PersonValidator : AbstractValidator<Person>
 {
  public PersonValidator()
  {
   this.RuleFor(p => p.Name)
     .NotEmpty()
     .WithMessage("名字不能為空");
   this.RuleFor(p => p.Age)
    .NotEmpty()
    .WithMessage("年齡不能為空!!");

   this.RuleFor(p => p.Address.Home)
    .MinimumLength(5)
    .WithMessage("家庭住址最短長(zhǎng)度為5");

  }
 }

通過(guò)Person.Address去給每一個(gè)屬性配置校驗(yàn),這并不是不能完成,但如果Address屬性比較比較多,在配置起來(lái)的時(shí)候重復(fù)工作量大大提高,并且人家AddressValidator已經(jīng)完成配置了,你再來(lái)配置一遍,可以算是在浪費(fèi)生命嗎?

幸好,F(xiàn)luentValidation提供了一種為屬性設(shè)置驗(yàn)證器的機(jī)制。

public class PersonValidator : AbstractValidator<Person>
 {
  public PersonValidator()
  {
   this.RuleFor(p => p.Name)
     .NotEmpty()
     .WithMessage("名字不能為空");
   this.RuleFor(p => p.Age)
    .NotEmpty()
    .WithMessage("年齡不能為空!!");

   this.RuleFor(p => p.Address)
    .NotNull()
    .WithMessage("地址不能為空")
    .SetValidator(new AddressValidator());

  }
 }

通過(guò)這樣我們就將Address下的Home和Phome的驗(yàn)證追加到Person的Address屬性上去了。

初步認(rèn)識(shí)和使用就先到這兒了。感謝各位看官。后續(xù)會(huì)持續(xù)更新,直到搭建完系統(tǒng)架構(gòu)。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論