Валидация данных в C# (.NET): библиотеки и подходы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Валидация данных в C# (.NET): полное руководство с примерами

Валидация данных — один из ключевых аспектов разработки надёжных приложений на C# в экосистеме .NET. Она гарантирует, что входящие данные соответствуют заданным правилам, предотвращая ошибки, уязвимости и некорректное состояние системы. В этой статье мы подробно разберём основные библиотеки и инструменты для валидации в .NET, включая встроенные механизмы и популярные сторонние решения.

Почему важна валидация данных?

Без валидации приложение может получить:

  • Некорректные типы данных (например, строку вместо числа).
  • Выход за допустимые диапазоны (отрицательный возраст, несуществующий email).
  • SQL-инъекции, XSS-атаки и другие угрозы безопасности.
  • Нарушение бизнес-логики (заказ без товаров, пустое имя пользователя).

Использование структурированных подходов к валидации делает код чище, тестируемее и безопаснее.

1. Встроенная валидация: Data Annotations (System.ComponentModel.DataAnnotations)

Самый простой и распространённый способ — использование атрибутов из пространства имён System.ComponentModel.DataAnnotations. Этот метод идеально подходит для моделей в ASP.NET Core MVC, Web API и Entity Framework.

Пример модели с атрибутами:

using System.ComponentModel.DataAnnotations;

public class User
{
    [Required(ErrorMessage = "Имя обязательно")]
    [StringLength(50, MinimumLength = 2, ErrorMessage = "Имя должно быть от 2 до 50 символов")]
    public string Name { get; set; }

    [Required]
    [EmailAddress(ErrorMessage = "Некорректный email")]
    public string Email { get; set; }

    [Range(1, 120, ErrorMessage = "Возраст должен быть от 1 до 120")]
    public int Age { get; set; }

    [Phone(ErrorMessage = "Некорректный номер телефона")]
    public string Phone { get; set; }
}

Программная проверка модели:

var user = new User { Name = "A", Email = "invalid", Age = 200 };
var context = new ValidationContext(user);
var results = new List<ValidationResult>();

bool isValid = Validator.TryValidateObject(user, context, results, true);

if (!isValid)
{
    foreach (var error in results)
    {
        Console.WriteLine(error.ErrorMessage);
    }
}

Преимущества: простота, встроенная поддержка в ASP.NET Core, автоматическая валидация на уровне контроллеров.

Недостатки: ограниченная гибкость, атрибуты жёстко привязаны к модели, сложно реализовать сложные бизнес-правила.

2. FluentValidation — гибкая и выразительная валидация

Библиотека FluentValidation — самый популярный сторонний инструмент для валидации в .NET. Она позволяет вынести правила валидации в отдельные классы, поддерживает цепочки вызовов, кастомные сообщения и сложные условия.

Установка через NuGet: Install-Package FluentValidation

Пример валидатора:

using FluentValidation;

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        RuleFor(u => u.Name)
            .NotEmpty().WithMessage("Имя не может быть пустым")
            .Length(2, 50).WithMessage("Длина имени от 2 до 50 символов");

        RuleFor(u => u.Email)
            .NotEmpty()
            .EmailAddress().WithMessage("Некорректный формат email");

        RuleFor(u => u.Age)
            .InclusiveBetween(1, 120).WithMessage("Возраст вне диапазона");

        // Кастомное правило
        RuleFor(u => u.Phone)
            .Matches(@"^\+?[1-9]\d{1,14}$").When(u => !string.IsNullOrEmpty(u.Phone))
            .WithMessage("Номер телефона в международном формате");
    }
}

Использование:

var validator = new UserValidator();
var user = new User { Name = "", Email = "bad", Age = 0 };
var result = validator.Validate(user);

if (!result.IsValid)
{
    foreach (var error in result.Errors)
    {
        Console.WriteLine($"{error.PropertyName}: {error.ErrorMessage}");
    }
}

Интеграция с ASP.NET Core:

// В Program.cs или Startup.cs
builder.Services.AddControllers()
    .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<UserValidator>());

Преимущества: высокая гибкость, читаемые цепочки правил, поддержка асинхронной валидации, кастомных условий, вложенных валидаторов, тестируемость.

3.

Рекомендаций