如何将继承属性传入自定义验证器的错误消息中?
如何在自定义ValidationAttribute错误消息中包含父类属性值
核心思路
自定义ValidationAttribute时,通过ValidationContext访问整个模型实例(而非仅当前被验证的属性值),即可获取父类中的ManufactureId并将其插入错误消息。
具体实现步骤
重写带上下文的IsValid方法
弃用仅接收属性值的IsValid(object value)重载,改用IsValid(object value, ValidationContext validationContext)——这个重载提供的validationContext包含了当前验证的完整模型对象。从上下文提取父类属性
通过validationContext.ObjectInstance获取模型实例,将其转换为BaseConfiguration(因MarketConfiguration继承自它,转换安全),直接读取ManufactureId属性值。构造含目标属性的错误消息
在错误消息模板中预留占位符,用实际的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
相关产品推荐
相关产品推荐

