< Summary

Information
Class: OzonOrdersWeb.ModelBinding.OrderNavigationValidationMetadataProvider
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/ModelBinding/OrderNavigationValidationMetadataProvider.cs
Line coverage
100%
Covered lines: 11
Uncovered lines: 0
Coverable lines: 11
Total lines: 47
Line coverage: 100%
Branch coverage
100%
Covered branches: 12
Total branches: 12
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
CreateValidationMetadata(...)100%66100%
IsNavigationEntity(...)100%66100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/ModelBinding/OrderNavigationValidationMetadataProvider.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
 2using OzonDomains.Models;
 3
 4namespace OzonOrdersWeb.ModelBinding;
 5
 6/// <summary>
 7/// Формы транзакций и редактирования заказов отправляют навигационные сущности заказа
 8/// (OzonClient, ProductInfo, ShipmentWarehouse и т.п.) только ссылкой — как <c>orders[i].OzonClient.Id</c>.
 9/// Model binder собирает из такого поля частичный объект, а валидатор затем проверяет его целиком
 10/// и ругается на незаполненные поля («Название» у OzonClient), хотя ни один экшен эти объекты
 11/// не редактирует. Провайдер отключает проверку вложенных полей навигаций <see cref="Order"/>,
 12/// оставляя валидацию собственных полей заказа без изменений.
 13/// </summary>
 14public sealed class OrderNavigationValidationMetadataProvider : IValidationMetadataProvider
 15{
 16    public void CreateValidationMetadata(ValidationMetadataProviderContext context)
 17    {
 32418        if (context.Key.MetadataKind != ModelMetadataKind.Property ||
 32419            context.Key.ContainerType != typeof(Order))
 20        {
 8621            return;
 22        }
 23
 23824        if (IsNavigationEntity(context.Key.ModelType))
 25        {
 2826            context.ValidationMetadata.ValidateChildren = false;
 27        }
 23828    }
 29
 30    /// <summary>
 31    /// Навигация на одну сущность домена: класс из OzonDomains.Models, не строка и не коллекция.
 32    /// </summary>
 33    internal static bool IsNavigationEntity(Type type)
 34    {
 24535        if (!type.IsClass || type == typeof(string))
 36        {
 19837            return false;
 38        }
 39
 4740        if (typeof(System.Collections.IEnumerable).IsAssignableFrom(type))
 41        {
 1042            return false;
 43        }
 44
 3745        return type.Namespace == typeof(Order).Namespace;
 46    }
 47}