Asp.net 使用FluentValidation验证枚举

Asp.net 使用FluentValidation验证枚举,asp.net,asp.net-web-api,enums,fluentvalidation,Asp.net,Asp.net Web Api,Enums,Fluentvalidation,我正在Web API项目中使用FluentValidation.WebApi 6.2.1.0。是否有方法使用FluentValidation验证枚举并返回自定义消息 我的控制器操作如下: public IHttpActionResult Get([FromUri]CheckUpdateVM info) { ... } 我的模特 [Validator(typeof(CheckUpdateVMValidator))] public class CheckUpdateVM { pub

我正在Web API项目中使用FluentValidation.WebApi 6.2.1.0。是否有方法使用FluentValidation验证枚举并返回自定义消息

我的控制器操作如下:

public IHttpActionResult Get([FromUri]CheckUpdateVM info)
{
    ...
}
我的模特

[Validator(typeof(CheckUpdateVMValidator))]
public class CheckUpdateVM
{
    public DeviceTypes Device { get; set; }
}
我渴望这样的东西

public class CheckUpdateVMValidator : AbstractValidator<CheckUpdateVM>
{
    public CheckUpdateVMValidator()
    {
        RuleFor(x => x.Device).Must(x => Enum.IsDefined(typeof(DeviceTypes), x)).WithMessage("xxx");
    }
}
公共类CheckUpdateVMValidator:AbstractValidator
{
公共CheckUpdateVMValidator()
{
(x=>x.Device).Must(x=>Enum.IsDefined(typeof(DeviceTypes),x)).WithMessage(“xxx”);
}
}

使用上述代码,模型绑定器验证“设备”参数的值,并响应错误。但我无法自定义错误消息。(如果我将“Device”属性类型设置为string,这很好。)

在这种情况下,创建自定义验证器可能是更好的方法

public class DeviceEnumValidator<T> : PropertyValidator {

public DeviceEnumValidator() 
    : base("Invalid Enum value!") { }

protected override bool IsValid(PropertyValidatorContext context) { 

    DeviceTypes enumVal= (DeviceTypes) Enum.Parse(typeof(DeviceTypes), context.PropertyValue);

    if (!Enum.IsDefined(typeof(DeviceTypes), enumVal) 
      return false;

    return true;
 }
}
公共类设备EnumValidator:PropertyValidator{
公共设备枚举验证器()
:base(“无效枚举值!”){}
受保护的覆盖布尔值有效(PropertyValidatorContext上下文){
DeviceTypes enumVal=(DeviceTypes)Enum.Parse(typeof(DeviceTypes),context.PropertyValue);
如果(!Enum.IsDefined(typeof(DeviceTypes),enumVal)
返回false;
返回true;
}
}
要使用DeviceEnumValidator,您可以在定义验证规则时调用SetValidator

public CheckUpdateVMValidator()
{
    RuleFor(x => x.Device).SetValidator(new DeviceEnumValidator<DeviceTypes>());
}
public CheckUpdateVMValidator()
{
RuleFor(x=>x.Device).SetValidator(新设备enumValidator());
}