json FluentValidation验证Enum值

mfuanj7w  于 2023-11-20  发布在  其他
关注(0)|答案(3)|浏览(165)

我有以下模型:

  1. public class ViewDataItem
  2. {
  3. public string viewName { get; set; }
  4. public UpdateIndicator updateIndicator { get; set; }
  5. }

字符串
使用以下枚举:

  1. public enum UpdateIndicator
  2. {
  3. Original,
  4. Update,
  5. Delete
  6. }


下面是验证器:

  1. public class ViewValidator : AbstractValidator<ViewDataItem>
  2. {
  3. public ViewValidator()
  4. {
  5. RuleFor(x => x.viewName).NotEmpty().WithMessage("View name must be specified");
  6. RuleFor(x => x.updateIndicator).SetValidator(new UpdateIndicatorEnumValidator<UpdateIndicator>());
  7. }
  8. }
  9. public class UpdateIndicatorEnumValidator<T> : PropertyValidator
  10. {
  11. public UpdateIndicatorEnumValidator() : base("Invalid update indicator") {}
  12. protected override bool IsValid(PropertyValidatorContext context)
  13. {
  14. UpdateIndicator enumVal = (UpdateIndicator)Enum.Parse(typeof(UpdateIndicator), context.PropertyValue.ToString());
  15. if (!Enum.IsDefined(typeof(UpdateIndicator), enumVal))
  16. return false;
  17. return true;
  18. }
  19. }


代码在一个WebAPI中,它通过JSON接收数据,将其转换为对象,然后进行验证,但出于某种原因,我可以在updateIndicator中发送任何我喜欢的东西,只要我不输入大于枚举中的最大索引的整数值(即1,2或3工作正常,但7将生成错误)。
我怎样才能得到这个来验证我收到的数据的输入,看看这个值是否真的在Enum中?

oxcyiej7

oxcyiej71#

试试内置的IsInEnum()

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

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

mtb9vblg

mtb9vblg2#

这个问题是由于API模型构建器会将发送到枚举的内容进行转换。如果找不到值,它不会填充该值,而是使用默认值(就像使用任何其他未填充的属性数据类型一样)。
为了更容易地判断发送的值是否是一个有效的枚举值,你应该让你的属性可以为空。这样,如果一个值不能被解析,它将被设置为null。如果你想确保属性被设置,只要让你的验证器不允许它为空值。

  1. public class ViewDataItem
  2. {
  3. public string viewName { get; set; }
  4. public UpdateIndicator? updateIndicator { get; set; }
  5. }
  6. public class ViewValidator : AbstractValidator<ViewDataItem>
  7. {
  8. public ViewValidator()
  9. {
  10. RuleFor(x => x.viewName).NotEmpty().WithMessage("View name must be specified");
  11. RuleFor(x => x.updateIndicator).NotNull();
  12. }
  13. }

字符串
如果不将属性设置为null,你的模型将始终拥有一个有效的值。或者,你可以让枚举的第一个值是一个虚拟值,但这将是一个代码气味。null模型属性更有意义。
如果您想知道发送到API端点的实际值是什么,您需要查看创建HTTP Handler,这超出了本问题的范围。

展开查看全部
aiazj4mn

aiazj4mn3#

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

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

字符串

相关问题