FluentValidation.AspNetCore 在.NET Core 6.0上使用的技巧和問題

FluentValidation.AspNetCore11.0.0.0

.NET Core 6.0

1.爲什麼使用FluentValidation?

一個原因是自定義屬性驗證代碼要寫很多,模型中的每個需要驗證的字段,都需要獨立的編寫相應的自定義屬性。FluentValidation對字段的驗證代碼需要的相對來說少了點。添加字段校驗更簡單。

另一個原因:對參數校驗進行了解耦,使用AOP分離了驗證功能。

2.驗證順序FluentValidation與Attribute

模型綁定-模型驗證(Attribute)-FluentValidation

3.可空字段驗證,可空字段如果有二階段驗證。例如可空的郵箱格式驗證

public class EmailReqValidator : AbstractValidator<EmailReq>
{
    public PlatformUserUpdateReqValidator()
    {
        RuleFor(_ => _.Email).EmailAddress().WithMessage("郵箱格式輸入有誤");
    }
}

public class EmailReq
{
    /// <summary>
    /// 郵箱
    /// </summary>
    [DisplayName("郵箱")]
    public string? Email { get; set; }
}

  

(1)null能通過驗證

{
  "email":null
}

(2)""不能通過驗證,提示:郵箱輸入有誤

{
  "email":"",
}

(3)不傳遞參數,不能通過驗證,提示:郵箱輸入有誤

{
}

 如果想要""和不傳遞參數時,通過校驗,建議調整驗證規則

public class EmailReqValidator : AbstractValidator<EmailReq>
{
    public PlatformUserUpdateReqValidator()
    {
        RuleFor(_ => _.Email).When(x=>!string.IsNullOrEmpty(x.Email)).EmailAddress().WithMessage("郵箱格式輸入有誤");
    }
}

  

4.FluentValidation CascadeMode全局設置

CascadeMode可以設置如果驗證失敗單個字段僅驗證一次,單個類僅驗證一次。

(1)設置模型類的CascadeMode,當模型的第一個驗證失敗,後續驗證不執行。

ValidatorOptions.Global.DefaultClassLevelCascadeMode = CascadeMode.Stop;

(1)設置模型字段的CascadeMode,當字段的第一個驗證失敗,後續驗證不執行。

ValidatorOptions.Global.DefaultRuleLevelCascadeMode = CascadeMode.Stop;

這兩個設置放到啓動文件裏面就可以,比如Program.cs文件,跟着FluentValidation注入代碼即可。

services.AddFluentValidationAutoValidation();//Fluent參數驗證
ValidatorOptions.Global.DefaultClassLevelCascadeMode = CascadeMode.Stop;
ValidatorOptions.Global.DefaultRuleLevelCascadeMode = CascadeMode.Stop;

5.IsEnum 枚舉驗證,默認值也校驗失敗(待優化)

public class BannerUpdateReqValidator : AbstractValidator<BannerUpdateReq>
{
    public BannerUpdateReqValidator()
    { 
    RuleFor(_ => _.Type).IsInEnum()
     .WithMessage("枚舉輸入有誤")
     .Must((x, y) => { return x.Type != BannerEnum.DEFAULT; })
     .WithMessage("枚舉輸入有誤");
     }
 }

public enum BannerEnum
{
    /// <summary>
    /// 默認
    /// </summary>
    [Description("默認")]
    DEFAULT = -1,
    /// <summary>
    /// 後臺Banner
    /// </summary>
    [Description("後臺Banner")]
    BANNER = 0,
}

public class BannerUpdateReq
{
    public BannerEnum Type { get; set; }
}

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章