1. 程式人生 > >C#全棧開發之後臺驗證(一)

C#全棧開發之後臺驗證(一)

開發 家庭 strac sta vat 怎麽 mar 地址 要求

在Web系統開發時,往往會有存在大量的交互操作,交互就必須校驗數據的準確性啊,且不說一個字段可能存在多種校驗,若一個表單提交有10個字段難道我們要對這10個字段分別寫代碼去校驗嗎?如果是這樣,那每一個表單都要單獨去寫一份校驗豈不是太痛苦了?

為了解決這個問題,聰明的程序員們開始了“偷懶”!

今天我們介紹一位在.NET平臺下偷懶的——“FluentValidation”,正如其名,流利的驗證,他將我們的驗證開發工作變得流利甚至優美了起來。

接下來我們就來看看如何使用它吧。

首先我們使用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; } }

有了模型,要想驗證模型,肯定得有驗證器才行,於是我們在創建一個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表示該驗證器驗證的實體,在構造函數裏通過this.RuleFor為指定的屬性設置驗證,在上述配置中為Person的Name和Age屬性都設置了非空,並且給出了相應的錯誤消息。

現在實體有了,驗證器也有了,就差東風了。

 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方法中需要一個參數Person,Person是個對象,裏面有3個屬性Name、Age、Sex,在Server內部我們創建了一個Person驗證器對象,用它來驗證我們的參數model, 驗證後會返回一個驗證結果。這個結果有2個重要的參數,第一是IsValid,驗證通過的時候返回True,第二個是Errors,他裏面存放的是所有驗證失敗的信息,在驗證失敗的時候通過遍歷Errors即可獲取到所有錯誤信息,如上所示通過錯誤信息的PropertyName就能知道是哪個對象出錯了,而ErrorMessage自然就對應這個Property所出錯內容的WithMessage了。下面是運行結果

技術分享圖片

技術分享圖片

技術分享圖片

至此,我們能夠使用基本驗證了。

但在我們實際應用中不一定會像上述案例一樣一帆風順,也許我們的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位之間");
        }
    }

現在需求變了,在Person實體的要求裏不僅要求Name、Age不能為空,並且還要求Address下的Home和Phone滿足AddressValidator的要求,這可怎麽辦呢?

當然你可以像這樣做

 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屬性比較比較多,在配置起來的時候重復工作量大大提高,並且人家AddressValidator已經完成配置了,你再來配置一遍,可以算是在浪費生命嗎?

幸好,FluentValidation提供了一種為屬性設置驗證器的機制。

 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屬性上去了。

技術分享圖片

初步認識和使用就先到這兒了。感謝各位看官。後續會持續更新,直到搭建完系統架構。

C#全棧開發之後臺驗證(一)