ASP.NET Core MVC自定义ValidationAttribute的IsValid方法未触发问题
解决ASP.NET Core MVC自定义ValidationAttribute的IsValid不执行问题
问题核心原因
在ASP.NET Core MVC的验证流程中,当属性值为null/空字符串时,RequiredAttribute(及其子类)的验证会优先执行;如果必填验证未通过,后续普通ValidationAttribute子类的验证会被直接跳过。这就是你的[CustomRequired]能正常触发验证,但[CustomValidation]仅构造函数被调用、IsValid方法不执行的原因——你测试时大概率提交了空表单,必填验证失败后,自定义验证直接被拦截跳过了。
另外可以先验证:若Name字段填写内容后提交,CustomValidation的IsValid方法应该会正常触发。
解决方案
根据需求分两种场景处理:
1. 仅在属性值有效时执行自定义验证
这种情况无需修改代码,只需确保测试时填写Name字段内容后再提交,CustomValidation的验证逻辑就会正常执行。
2. 强制所有场景(包括值为空)执行自定义验证
如果需要不管必填验证结果如何,都执行CustomValidation的逻辑,只需在自定义特性中重写IsValidatingForRequiredAttribute属性并返回true:
public class CustomValidation : ValidationAttribute { // 重写此属性,让验证即使在值为空时也能触发 public override bool IsValidatingForRequiredAttribute => true; protected override ValidationResult? IsValid(object? value, ValidationContext validationContext) { // 你的验证逻辑,示例:处理空值场景 if (value == null || string.IsNullOrWhiteSpace(value.ToString())) { return new ValidationResult("自定义空值验证提示"); } // 其他业务验证逻辑 return ValidationResult.Success; } }
额外说明
- 若不需要
[CustomRequired]和[CustomValidation]同时存在,可以直接在CustomValidation中整合必填逻辑,去掉[CustomRequired],避免重复验证。 - 默认的
[Required]、[StringLength]等特性的执行优先级和触发规则遵循ASP.NET Core验证管道逻辑,确保必填类验证优先执行。
内容的提问来源于stack exchange,提问作者SkriTex
相关产品推荐
相关产品推荐

