ASP.NET全棧開發(fā)教程之前后臺校驗結(jié)合詳解
前言
在Web系統(tǒng)開發(fā)時,往往會有存在大量的交互操作,交互就必須校驗數(shù)據(jù)的準(zhǔn)確性啊,且不說一個字段可能存在多種校驗,若一個表單提交有10個字段難道我們要對這10個字段分別寫代碼去校驗嗎?如果是這樣,那每一個表單都要單獨去寫一份校驗豈不是太痛苦了?
為了解決這個問題,聰明的程序員們開始了“偷懶”!
今天我們介紹一位在.NET平臺下偷懶的——“FluentValidation”,正如其名,流利的驗證,他將我們的驗證開發(fā)工作變得流利甚至優(yōu)美了起來。
接下來我們就來看看如何使用它吧。
首先我們使用nuget安裝 FluentValidation
Nuget安裝命令:Install-Package FluentValidation -Version 7.6.104
由于FluentValidation的驗證是基于模型的,所以,我們先來建立一個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; }
}
有了模型,要想驗證模型,肯定得有驗證器才行,于是我們在創(chuàng)建一個Person的驗證器
public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
this.RuleFor(p => p.Name)
.NotEmpty()
.WithMessage("名字不能為空");
this.RuleFor(p => p.Age)
.NotEmpty()
.WithMessage("年齡不能為空!!");
}
}
驗證器必須繼承自AbstractValidator<T> ,泛型T表示該驗證器驗證的實體,在構(gòu)造函數(shù)里通過this.RuleFor為指定的屬性設(shè)置驗證,在上述配置中為Person的Name和Age屬性都設(shè)置了非空,并且給出了相應(yīng)的錯誤消息。
現(xià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)
{
//失敗的屬性名稱,如錯誤信息
Console.WriteLine("Property " + failure.PropertyName + " failed validation. Error was: " + failure.ErrorMessage);
}
}
Console.WriteLine("驗證完成!!");
}
}
在Server方法中需要一個參數(shù)Person,Person是個對象,里面有3個屬性Name、Age、Sex,在Server內(nèi)部我們創(chuàng)建了一個Person驗證器對象,用它來驗證我們的參數(shù)model, 驗證后會返回一個驗證結(jié)果。這個結(jié)果有2個重要的參數(shù),第一是IsValid,驗證通過的時候返回True,第二個是Errors,他里面存放的是所有驗證失敗的信息,在驗證失敗的時候通過遍歷Errors即可獲取到所有錯誤信息,如上所示通過錯誤信息的PropertyName就能知道是哪個對象出錯了,而ErrorMessage自然就對應(yīng)這個Property所出錯內(nèi)容的WithMessage了。下面是運(yùn)行結(jié)果


至此,我們能夠使用基本驗證了。
但在我們實際應(yīng)用中不一定會像上述案例一樣一帆風(fēng)順,也許我們的Person里會有一個Address屬性,他的類型不是一個String,而是一個對象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也有一個驗證器
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實體的要求里不僅要求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("家庭住址最短長度為5");
}
}
通過Person.Address去給每一個屬性配置校驗,這并不是不能完成,但如果Address屬性比較比較多,在配置起來的時候重復(fù)工作量大大提高,并且人家AddressValidator已經(jīng)完成配置了,你再來配置一遍,可以算是在浪費生命嗎?
幸好,F(xiàn)luentValidation提供了一種為屬性設(shè)置驗證器的機(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());
}
}
通過這樣我們就將Address下的Home和Phome的驗證追加到Person的Address屬性上去了。

初步認(rèn)識和使用就先到這兒了。感謝各位看官。后續(xù)會持續(xù)更新,直到搭建完系統(tǒng)架構(gòu)。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
對GridView的行加顏色并彈出Kindeditor的實現(xiàn)思路
本文主要詳細(xì)介紹下對GridView的行加顏色并彈出Kindeditor,感興趣的朋友可以了解下,希望可以幫助到你2013-04-04
Redis數(shù)據(jù)庫基礎(chǔ)與ASP.NET?Core緩存實現(xiàn)
這篇文章介紹了Redis數(shù)據(jù)庫基礎(chǔ)與ASP.NET?Core緩存實現(xiàn)的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
ASP.NET?MVC使用typeahead.js實現(xiàn)輸入智能提示功能
這篇文章介紹了ASP.NET?MVC使用typeahead.js實現(xiàn)輸入智能提示功能的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
asp.net下gridview 批量刪除的實現(xiàn)方法
asp.net下gridview 批量刪除的實現(xiàn)方法...2007-11-11
ASP.NET Core 7 Razor Pages項目發(fā)布到IIS的詳細(xì)過程
這篇文章主要介紹了ASP.NET Core 7 Razor Pages項目發(fā)布到IIS的詳細(xì)過程,詳細(xì)介紹了發(fā)布過程遇到的問題及解決方法,對ASP.NET Core 發(fā)布到IIS相關(guān)知識感興趣的朋友一起看看吧2023-01-01
MessagePack 和System.Text.Json 序列化和反序列化性能及對比分析
這篇文章主要介紹了MessagePack 和System.Text.Json 序列化和反序列化性能及對比分析,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
.NET Core單文件發(fā)布靜態(tài)編譯AOT CoreRT的方法詳解
這篇文章主要給大家介紹了關(guān)于.NET Core單文件發(fā)布靜態(tài)編譯AOT CoreRT的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07

