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

FluentValidation升级后ValidationContext<T>设置Severity方法

FluentValidation 8.6.2升级11.1.0 自定义验证器Severity适配方案
  • 旧版本代码失效原因:FluentValidation从9.x版本开始重构了验证上下文的公开API,ValidationContext<T>不再对外暴露Rule属性,原有的通过context.Rule.CurrentValidator.Options.Severity修改严重级别的写法属于访问内部实例属性的逻辑,在新版本中已被移除出公开API范畴。
  • 分场景适配方式:
    1. 固定Severity配置场景(推荐优先使用)
      不需要在自定义验证器内部编写Severity设置逻辑,直接在验证规则定义的链式调用中通过WithSeverity方法指定即可,示例代码:
    // 对应实体的验证类中定义规则
    RuleFor(x => x.TargetProperty)
      .SetValidator(new YourCustomValidator())
      .WithSeverity(Severity.Warning); // 直接指定该验证规则的固定严重级别
    
    1. 运行时动态设置Severity场景
      如果需要根据验证时的入参、属性值、上下文信息动态决定严重级别,不需要访问规则链配置,直接在验证失败时给返回的ValidationFailure对象指定Severity属性即可,示例自定义验证器代码:
    using FluentValidation;
    using FluentValidation.Validators;
    
    public class CustomAgeValidator : PropertyValidator<User, int>
    {
      public override string Name => "AgeRangeCheck";
    
      public override bool IsValid(ValidationContext<User> context, int ageValue)
      {
        // 自定义验证逻辑:比如年龄小于12岁触发校验
        if (ageValue < 12)
        {
          // 动态计算需要设置的严重级别,比如根据用户角色不同返回不同级别
          var currentSeverity = context.InstanceToValidate.IsVip ? Severity.Info : Severity.Error;
          
          // 新增验证失败条目时直接指定Severity
          context.AddFailure(new ValidationFailure(
            context.PropertyPath,
            "年龄不符合参与活动要求"
          ){
            Severity = currentSeverity
          });
          return false;
        }
        return true;
      }
    
      protected override string GetDefaultMessageTemplate(string errorCode)
        => "年龄校验不通过";
    }
    

注意:不推荐通过反射或者转换为内部接口的方式强行访问ValidationContext<T>隐藏的Rule属性修改配置,这类属于非公开API,后续小版本迭代都可能发生变更,没有兼容性保障。

内容的提问来源于stack exchange,提问作者Eric Murchie-Beyma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:51:19