FluentValidationFormComponent.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using FluentValidation;
  2. using FluentValidation.Internal;
  3. using Microsoft.AspNetCore.Components;
  4. using Microsoft.AspNetCore.Components.Forms;
  5. namespace BlazorEditForms;
  6. public class FluentValidationFormComponent : ComponentBase
  7. {
  8. [CascadingParameter] EditContext? CurrentEditContext { get; set; }
  9. [Parameter] public IValidator? Validator { get; set; }
  10. [Inject] private IServiceProvider ServiceProvider { get; set; } = default!;
  11. private ValidationMessageStore? _messages;
  12. protected override void OnInitialized()
  13. {
  14. if (CurrentEditContext == null)
  15. {
  16. throw new InvalidOperationException($"{nameof(FluentValidationFormComponent)} requires a cascading parameter of type {nameof(EditContext)}");
  17. }
  18. if (Validator == null)
  19. {
  20. throw new InvalidOperationException($"{nameof(FluentValidationFormComponent)} requires a parameter of type {nameof(IValidator)}");
  21. }
  22. _messages = new ValidationMessageStore(CurrentEditContext);
  23. CurrentEditContext.OnFieldChanged += CurrentEditContext_OnFieldChanged;
  24. CurrentEditContext.OnValidationRequested += CurrentEditContext_OnValidationRequested;
  25. }
  26. private async void CurrentEditContext_OnFieldChanged(object? sender, FieldChangedEventArgs e)
  27. {
  28. //var context = new ValidationContext<object>(e.FieldIdentifier.Model, new PropertyChain(), new MemberNameValidatorSelector([e.FieldIdentifier.FieldName]));
  29. var context = new ValidationContext<object>(CurrentEditContext!.Model, new PropertyChain(), new MemberNameValidatorSelector([e.FieldIdentifier.FieldName]));
  30. var validationResults = await Validator!.ValidateAsync(context);
  31. _messages!.Clear(e.FieldIdentifier);
  32. foreach (var validationResult in validationResults.Errors)
  33. {
  34. _messages.Add(e.FieldIdentifier, validationResult.ErrorMessage);
  35. }
  36. CurrentEditContext!.NotifyValidationStateChanged();
  37. }
  38. private async void CurrentEditContext_OnValidationRequested(object? sender, ValidationRequestedEventArgs e)
  39. {
  40. var context = new ValidationContext<object>(CurrentEditContext!.Model);
  41. var validationResults = await Validator!.ValidateAsync(context);
  42. _messages!.Clear();
  43. foreach (var validationResult in validationResults.Errors)
  44. {
  45. var fieldIdentifier = CurrentEditContext.Field(validationResult.PropertyName);
  46. _messages.Add(fieldIdentifier, validationResult.ErrorMessage);
  47. }
  48. CurrentEditContext.NotifyValidationStateChanged();
  49. }
  50. }