[英]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.