File: ModelBinding\Validation\DefaultModelValidatorProvider.cs
Web Access
Project: src\src\Mvc\Mvc.Core\src\Microsoft.AspNetCore.Mvc.Core.csproj (Microsoft.AspNetCore.Mvc.Core)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable enable
 
namespace Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
 
/// <summary>
/// A default <see cref="IModelValidatorProvider"/>.
/// </summary>
/// <remarks>
/// The <see cref="DefaultModelValidatorProvider"/> provides validators from <see cref="IModelValidator"/>
/// instances in <see cref="ModelBinding.ModelMetadata.ValidatorMetadata"/>.
/// </remarks>
internal sealed class DefaultModelValidatorProvider : IMetadataBasedModelValidatorProvider
{
    /// <inheritdoc />
    public void CreateValidators(ModelValidatorProviderContext context)
    {
        //Perf: Avoid allocations here
        for (var i = 0; i < context.Results.Count; i++)
        {
            var validatorItem = context.Results[i];
 
            // Don't overwrite anything that was done by a previous provider.
            if (validatorItem.Validator != null)
            {
                continue;
            }
 
            if (validatorItem.ValidatorMetadata is IModelValidator validator)
            {
                validatorItem.Validator = validator;
                validatorItem.IsReusable = true;
            }
        }
    }
 
    public bool HasValidators(Type modelType, IList<object> validatorMetadata)
    {
        for (var i = 0; i < validatorMetadata.Count; i++)
        {
            if (validatorMetadata[i] is IModelValidator)
            {
                return true;
            }
        }
 
        return false;
    }
}