【问题标题】:FluentValidation validate Enum valueFluentValidation 验证枚举值
【发布时间】:2017-12-14 07:04:13
【问题描述】:

我有以下型号:

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;
    }
}

代码位于通过 JSON 接收数据的 WebAPI 中,将其反序列化为对象,然后进行验证,但由于某种原因,我可以在 updateIndicator 中发送我喜欢的任何内容,只要我不输入大于枚举中最大索引的整数值(即 1,2 或 3 可以正常工作,但 7 会产生错误)。

我怎样才能得到这个来验证我收到的数据的输入,看看那个值是否真的在 Enum 中?

【问题讨论】:

  • 您正在尝试查看viewName 是否是UpdateIndicator 中的文本值?
  • 我正在尝试查看以“updateIndicator”形式发送的文本值是否确实存在于枚举 UpdateIndicator 中。即如果有人发送“香蕉”它应该返回一个错误,但如果有人发送“原始”(存在于枚举中)它应该验证就好了。
  • 这不会发生。尝试使用无效值从 Postman 或 Fiddler 调用端点,看看会发生什么。它将为您提供枚举的默认值(第一个值)。如果你想防止这种情况发生,你可以使属性为空,但你的验证不允许空值。
  • 谢谢。你刚刚帮我把盒子炸开了。它使用可为空的 Enum 修复并检查空值。 :)
  • 我会为此写一个答案。我相信它会派上用场。

标签: c# json asp.net-web-api enums fluentvalidation


【解决方案1】:

试试内置的IsInEnum()

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

这会检查提供的枚举值是否在你的枚举范围内,如果不是,验证将失败:

"'updateIndicator' 的值范围不包括 '7'。"

【讨论】:

  • 也许最好手动检查默认值zero。或添加NotNull()
【解决方案2】:

问题源于 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,则您的模型在拥有它时将始终具有有效值。或者,您可以将枚举的第一个值设置为虚拟值,但这将是代码异味。空模型属性更有意义。

如果您想了解发送到 API 端点的实际值是什么,您需要查看创建一个 HTTP Handler,这超出了本问题的范围。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2021-05-16
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
相关资源
最近更新 更多