Валидация данных в 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>());
Преимущества: высокая гибкость, читаемые цепочки правил, поддержка асинхронной валидации, кастомных условий, вложенных валидаторов, тестируемость.