json FluentValidation验证Enum值

mfuanj7w  于 10个月前  发布在  其他
关注(0)|答案(3)|浏览(117)

我有以下模型:

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中?

oxcyiej7

oxcyiej71#

试试内置的IsInEnum()

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

字符串
这将检查提供的枚举值是否在您的枚举范围内,如果不在,验证将失败:
“'updateIndicator'具有不包括'7'的值范围。”

mtb9vblg

mtb9vblg2#

这个问题是由于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 Handler,这超出了本问题的范围。

aiazj4mn

aiazj4mn3#

这对我来说似乎没问题。但是如果请求是FooEnum类型的,那么来自Stacked的答案通常会更好

RuleFor(x => x.Foo).Must(i => Enum.IsDefined(typeof(FooEnum), i));

字符串

相关问题