Skip to content

Instantly share code, notes, and snippets.

@edihasaj
Created January 9, 2022 19:30
Show Gist options
  • Save edihasaj/d5a39c3da3d9f88c1c50535d8aa26ab3 to your computer and use it in GitHub Desktop.
Save edihasaj/d5a39c3da3d9f88c1c50535d8aa26ab3 to your computer and use it in GitHub Desktop.

Revisions

  1. edihasaj created this gist Jan 9, 2022.
    24 changes: 24 additions & 0 deletions CompositeValidationResult.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,24 @@
    public class CompositeValidationResult : ValidationResult
    {
    private readonly List<ValidationResult> _results = new();

    public CompositeValidationResult(string errorMessage) : base(errorMessage)
    {
    }

    public CompositeValidationResult(string errorMessage, IEnumerable<string> memberNames) : base(errorMessage,
    memberNames)
    {
    }

    protected CompositeValidationResult(ValidationResult validationResult) : base(validationResult)
    {
    }

    public IEnumerable<ValidationResult> Results => _results;

    public void AddResult(ValidationResult validationResult)
    {
    _results.Add(validationResult);
    }
    }
    31 changes: 31 additions & 0 deletions ValidateObjectAttribute.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,31 @@
    public class ValidateObjectAttribute : ValidationAttribute
    {
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
    if (value == null) return ValidationResult.Success;
    var results = new List<ValidationResult>();

    if (value is not IEnumerable<object> list)
    {
    var context = new ValidationContext(value, null, null);
    Validator.TryValidateObject(value, context, results, true);
    }
    else
    {
    foreach (var o in list)
    {
    var context = new ValidationContext(o, null, null);
    Validator.TryValidateObject(o, context, results, true);
    }
    }

    if (results.Count == 0) return ValidationResult.Success;

    var compositeResults =
    new CompositeValidationResult(
    $"{validationContext.DisplayName} {string.Join("; ", results.Select(r => r.ErrorMessage))}");
    results.ForEach(compositeResults.AddResult);

    return compositeResults;
    }
    }