我有以下模型:
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中?
3条答案
按热度按时间oxcyiej71#
试试内置的
IsInEnum()
字符串
这将检查提供的枚举值是否在您的枚举范围内,如果不在,验证将失败:
“'updateIndicator'具有不包括'7'的值范围。”
mtb9vblg2#
这个问题是由于API模型构建器会将发送到枚举的内容进行转换。如果找不到值,它不会填充该值,而是使用默认值(就像使用任何其他未填充的属性数据类型一样)。
为了更容易地判断发送的值是否是一个有效的枚举值,你应该让你的属性可以为空。这样,如果一个值不能被解析,它将被设置为
null
。如果你想确保属性被设置,只要让你的验证器不允许它为空值。字符串
如果不将属性设置为null,你的模型将始终拥有一个有效的值。或者,你可以让枚举的第一个值是一个虚拟值,但这将是一个代码气味。null模型属性更有意义。
如果您想知道发送到API端点的实际值是什么,您需要查看创建HTTP Handler,这超出了本问题的范围。
aiazj4mn3#
这对我来说似乎没问题。但是如果请求是FooEnum类型的,那么来自Stacked的答案通常会更好
字符串