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

如何将继承属性传入自定义验证器的错误消息中?

如何在自定义ValidationAttribute错误消息中包含父类属性值

核心思路

自定义ValidationAttribute时,通过ValidationContext访问整个模型实例(而非仅当前被验证的属性值),即可获取父类中的ManufactureId并将其插入错误消息。

具体实现步骤

  1. 重写带上下文的IsValid方法
    弃用仅接收属性值的IsValid(object value)重载,改用IsValid(object value, ValidationContext validationContext)——这个重载提供的validationContext包含了当前验证的完整模型对象。

  2. 从上下文提取父类属性
    通过validationContext.ObjectInstance获取模型实例,将其转换为BaseConfiguration(因MarketConfiguration继承自它,转换安全),直接读取ManufactureId属性值。

  3. 构造含目标属性的错误消息
    在错误消息模板中预留占位符,用实际的ManufactureId值和允许的Store列表完成格式化。

代码示例

自定义AcceptedStoresAttribute实现

public class AcceptedStoresAttribute : ValidationAttribute
{
    private readonly int[] _acceptedStores;

    public AcceptedStoresAttribute(params int[] acceptedStores)
    {
        _acceptedStores = acceptedStores;
        // 预设带占位符的错误消息模板
        ErrorMessage = "厂商{0}的Store值无效,仅允许输入:{1}";
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // 检查模型实例类型并提取ManufactureId
        if (validationContext.ObjectInstance is BaseConfiguration baseConfig)
        {
            var manufactureId = baseConfig.ManufactureId;
            var storeValue = Convert.ToInt32(value);

            if (!_acceptedStores.Contains(storeValue))
            {
                // 格式化错误消息,替换占位符
                var formattedMsg = string.Format(ErrorMessage, 
                    manufactureId, 
                    string.Join(", ", _acceptedStores));
                return new ValidationResult(formattedMsg);
            }
        }

        return ValidationResult.Success;
    }
}

模型类定义(匹配你的代码结构)

public class BaseConfiguration
{
    public int ManufactureId { get; set; }
}

public class MarketConfiguration : BaseConfiguration
{
    [AcceptedStores(0, 2, 11)]
    public int Store { get; set; }
}

注意事项

  • 若模型存在多继承场景,可增加类型判断逻辑避免转换失败;
  • 错误消息的占位符需与string.Format的参数顺序对应,也可使用.NET支持的命名占位符格式(如{ManufactureId})增强可读性;
  • Postman请求时确保manufactureId和store字段正确传入,模型绑定后验证器即可正常读取ManufactureId值。

内容的提问来源于stack exchange,提问作者MarkCo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:42:24