File: Forms\ClientValidation\ClientValidationData.cs
Web Access
Project: src\aspnetcore\src\Components\Web\src\Microsoft.AspNetCore.Components.Web.csproj (Microsoft.AspNetCore.Components.Web)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Extensions.DependencyInjection;
 
namespace Microsoft.AspNetCore.Components.Forms;
 
/// <summary>
/// Renders the per-form client-side validation carrier when client-side validation is activated
/// for the surrounding form and the registered <see cref="ClientValidationProvider"/> produces some content.
/// </summary>
internal sealed class ClientValidationData : IComponent
{
    private RenderHandle _handle;
    private bool _hasRendered;
 
    [Inject] private IServiceProvider Services { get; set; } = default!;
 
    [CascadingParameter] private EditContext? CurrentEditContext { get; set; }
 
    public void Attach(RenderHandle renderHandle) => _handle = renderHandle;
 
    public Task SetParametersAsync(ParameterView parameters)
    {
        parameters.SetParameterProperties(this);
 
        if (_hasRendered)
        {
            return Task.CompletedTask;
        }
 
        _hasRendered = true;
 
        // No surrounding EditForm, or no validator activated client validation for this form.
        if (CurrentEditContext is null
            || !CurrentEditContext.Properties.TryGetValue(typeof(DataAnnotationsValidator), out _))
        {
            return Task.CompletedTask;
        }
 
        var provider = Services.GetService<ClientValidationProvider>();
        if (provider is null)
        {
            return Task.CompletedTask;
        }
 
        // Inputs that rendered under this EditContext registered their field + HTML name into the registry.
        var registry = RenderedFieldRegistry.Get(CurrentEditContext);
        if (registry is null || registry.Fields.Count == 0)
        {
            return Task.CompletedTask;
        }
 
        var fragment = provider.RenderClientValidationRules(CurrentEditContext, registry.Fields);
        if (fragment is not null)
        {
            _handle.Render(fragment);
        }
 
        return Task.CompletedTask;
    }
}