【发布时间】: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