ASP.NET Core Web API:如何用数据注解基于枚举值验证ChargeMode
在ASP.NET Core 6 Web API中验证枚举属性的两种方法
针对你的场景,要验证CustomerDto里的ChargeMode属性是否属于EnumList.ChargeMode中定义的有效值,有两种实用的实现方式:
方法一:使用内置的[EnumDataType]数据注解
ASP.NET Core提供了专门的枚举验证属性,直接加到DTO的属性上即可,它会自动校验传入值是否是枚举中定义的合法项:
public class CustomerDto { [Required] [EnumDataType(typeof(EnumList.ChargeMode))] public EnumList.ChargeMode ChargeMode { get; set; } }
注意:如果你的业务不允许None(值为0)这个选项,还可以搭配[Range]注解进一步限制范围,比如只允许1和2:
[Required] [EnumDataType(typeof(EnumList.ChargeMode))] [Range((int)EnumList.ChargeMode.Fixed, (int)EnumList.ChargeMode.Percentage)] public EnumList.ChargeMode ChargeMode { get; set; }
方法二:自定义验证属性(适用于复杂规则)
如果需要更灵活的验证逻辑(比如动态排除某些枚举值),可以自定义一个继承自ValidationAttribute的验证类:
- 先写自定义验证属性:
public class ValidChargeModeAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value is not EnumList.ChargeMode chargeMode) { return new ValidationResult("无效的收费模式"); } // 这里可以自定义验证规则,比如排除None if (!Enum.IsDefined(typeof(EnumList.ChargeMode), chargeMode) || chargeMode == EnumList.ChargeMode.None) { return new ValidationResult("请选择有效的收费模式(固定或百分比)"); } return ValidationResult.Success; } }
- 然后在DTO中使用这个自定义注解:
public class CustomerDto { [Required] [ValidChargeMode] public EnumList.ChargeMode ChargeMode { get; set; } }
另外补充一点:ASP.NET Core的模型绑定默认会对枚举类型做基础校验,如果传入的数值不在枚举定义范围内,会自动返回400错误,但使用数据注解可以更明确地控制验证规则和错误提示信息。
内容的提问来源于stack exchange,提问作者Ayobamilaye
相关产品推荐
相关产品推荐

