如何合并属性验证与自定义验证结果并获取全部无效属性错误?
合并基于属性的验证与自定义验证结果
可以实现两种验证结果的合并,核心是确保同时触发数据注解验证和IValidatableObject自定义验证,并将结果整合输出。以下是具体解决方案:
解决方案1:显式配置MiniValidator验证选项
如果使用MiniValidation库,可通过ValidationOptions明确启用两种验证逻辑,确保库同时执行数据注解和自定义验证并合并结果:
using MiniValidation; using System.ComponentModel.DataAnnotations; var widget = new Widget { Name = "A", Age = 0 }; // 配置验证选项,确保启用两种验证 var validationOptions = new ValidationOptions { ValidateDataAnnotations = true, ValidateValidatableObject = true }; if (!MiniValidator.TryValidate(widget, validationOptions, out var errors)) { foreach (var entry in errors) { Console.WriteLine($" {entry.Key}:"); foreach (var error in entry.Value) { Console.WriteLine($" - {error}"); } } } class Widget : IValidatableObject { [Required, MinLength(3)] public string Name { get; set; } = null!; public int Age { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext ctx) { if (Age < 10) yield return new ValidationResult("Age cannot be less than 10.", [nameof(Age)]); } }
解决方案2:手动合并两种验证结果
如果需要完全控制验证流程,可直接调用.NET原生验证API分别执行数据注解和自定义验证,再手动合并结果:
using System.ComponentModel.DataAnnotations; var widget = new Widget { Name = "A", Age = 0 }; var validationContext = new ValidationContext(widget); var allValidationResults = new List<ValidationResult>(); // 执行数据注解验证(validateAllProperties确保验证所有属性规则) Validator.TryValidateObject(widget, validationContext, allValidationResults, validateAllProperties: true); // 执行IValidatableObject自定义验证 if (widget is IValidatableObject validatable) { foreach (var result in validatable.Validate(validationContext)) { if (result != ValidationResult.Success) { allValidationResults.Add(result); } } } // 整理并输出所有错误 if (allValidationResults.Any()) { var errors = allValidationResults .SelectMany(r => r.MemberNames.DefaultIfEmpty(""), (r, m) => new { MemberName = m, ErrorMessage = r.ErrorMessage }) .GroupBy(x => x.MemberName) .ToDictionary(g => g.Key, g => g.Select(x => x.ErrorMessage!).ToArray()); foreach (var entry in errors) { Console.WriteLine($" {entry.Key}:"); foreach (var error in entry.Value) { Console.WriteLine($" - {error}"); } } } class Widget : IValidatableObject { [Required, MinLength(3)] public string Name { get; set; } = null!; public int Age { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext ctx) { if (Age < 10) yield return new ValidationResult("Age cannot be less than 10.", [nameof(Age)]); } }
两种方案都能输出所有验证错误:
- Name属性的
MinLength(3)错误 - Age属性的自定义验证错误
内容的提问来源于stack exchange,提问作者D G
相关产品推荐
相关产品推荐

