You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:08:35