簡體   English   中英

FluentValidation驗證枚舉值

[英]FluentValidation validate Enum value

我有以下型號:

public class ViewDataItem
{
    public string viewName { get; set; }
    public UpdateIndicator updateIndicator { get; set; }
}

使用以下枚舉:

public enum UpdateIndicator
{
    Original,
    Update,
    Delete
}

以下驗證者:

public class ViewValidator : AbstractValidator<ViewDataItem>
{
    public ViewValidator()
    {
        RuleFor(x => x.viewName).NotEmpty().WithMessage("View name must be specified");
        RuleFor(x => x.updateIndicator).SetValidator(new UpdateIndicatorEnumValidator<UpdateIndicator>());
    }
}

public class UpdateIndicatorEnumValidator<T> : PropertyValidator
{
    public UpdateIndicatorEnumValidator() : base("Invalid update indicator") {}

    protected override bool IsValid(PropertyValidatorContext context)
    {
        UpdateIndicator enumVal = (UpdateIndicator)Enum.Parse(typeof(UpdateIndicator), context.PropertyValue.ToString());

        if (!Enum.IsDefined(typeof(UpdateIndicator), enumVal))
          return false;

        return true;
    }
}

代碼在WebAPI中,通過JSON接收數據,將其反序列化為對象然后驗證,但由於某種原因,我可以在updateIndicator發送任何我喜歡的內容,只要我沒有輸入大於枚舉中的最大索引(即1,2或3工作正常,但7會產生錯誤)。

我怎樣才能驗證我收到的數據的輸入,以查看該值是否實際在Enum中?

試試內置的IsInEnum()

RuleFor(x => x.updateIndicator).IsInEnum();

這將檢查提供的枚舉值是否在枚舉范圍內,否則驗證將失敗:

“'updateIndicator'有一系列不包含'7'的值。”

問題產生於API模型構建器將轉換發送到枚舉的內容。 如果未找到值,則不會填充該值,並使用默認值(與未填充的任何其他屬性數據類型一樣)。

為了便於判斷發送的值是否為有效的枚舉值,您應該使您的屬性可以為空。 這樣,如果無法解析值,則將其設置為null 如果要確保設置屬性,只需讓驗證程序不允許空值。

public class ViewDataItem
{
    public string viewName { get; set; }
    public UpdateIndicator? updateIndicator { get; set; }
}

public class ViewValidator : AbstractValidator<ViewDataItem>
{
    public ViewValidator()
    {
        RuleFor(x => x.viewName).NotEmpty().WithMessage("View name must be specified");
        RuleFor(x => x.updateIndicator).NotNull();
    }
}

如果不將該屬性設置為null,則在獲得該模型時,模型將始終具有有效值。 或者,您可以將枚舉的第一個值設為虛擬值,但這可能是代碼氣味。 null模型屬性更有意義。

如果要查找發送到API端點的實際值是什么,則需要查看創建HTTP處理程序 ,這超出了此問題的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM