From 61ba2254376d445e434aeb3db7efd2edc5c90c0d Mon Sep 17 00:00:00 2001 From: Pedro Sampaio Date: Mon, 25 Nov 2024 18:50:00 +0000 Subject: [PATCH] Added support for collections of simple types (i.e. List) --- .../EditContextFluentValidationExtensions.cs | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Blazored.FluentValidation/EditContextFluentValidationExtensions.cs b/src/Blazored.FluentValidation/EditContextFluentValidationExtensions.cs index b217c43..c3c3b81 100644 --- a/src/Blazored.FluentValidation/EditContextFluentValidationExtensions.cs +++ b/src/Blazored.FluentValidation/EditContextFluentValidationExtensions.cs @@ -99,13 +99,20 @@ private static async Task ValidateField(EditContext editContext, if (validator is not null) { var validationResults = await validator.ValidateAsync(new ValidationContext(editContext.Model, new PropertyChain(), compositeSelector)); - var errorMessages = validationResults.Errors - .Where(validationFailure => validationFailure.PropertyName == propertyPath) - .Select(validationFailure => validationFailure.ErrorMessage) - .Distinct(); + + List errorMessages = new(); + foreach (var validationResult in validationResults.Errors) + { + var newFieldIdentifier = ToFieldIdentifier(editContext, validationResult.PropertyName); + var newPropertyPath = PropertyPathHelper.ToFluentPropertyPath(editContext, newFieldIdentifier); + if (propertyPath == newPropertyPath) + { + errorMessages.Add(validationResult.ErrorMessage); + } + } messages.Clear(fieldIdentifier); - messages.Add(fieldIdentifier, errorMessages); + messages.Add(fieldIdentifier, errorMessages.Distinct()); editContext.NotifyValidationStateChanged(); } @@ -267,6 +274,13 @@ private static FieldIdentifier ToFieldIdentifier(in EditContext editContext, in nextTokenEnd = propertyPathAsSpan.IndexOfAny(Separators); if (nextTokenEnd < 0) { + // It's a collection of simple types + if (propertyPathAsSpan.EndsWith("]")) + { + propertyPathAsSpan = propertyPathAsSpan.Slice(0, propertyPathAsSpan.Length - 1); + return new FieldIdentifier(obj, propertyPathAsSpan.ToString()); + } + return new FieldIdentifier(obj, propertyPathAsSpan.ToString()); } }