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

如何合并属性验证与自定义验证结果并获取全部无效属性错误?

合并基于属性的验证与自定义验证结果

可以实现两种验证结果的合并,核心是确保同时触发数据注解验证和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:30:57