Как стать автором
Обновить

Обзор библиотеки FluentValidation. Часть 7.1. Встроенные валидаторы

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров1.6K

← Предыдущая часть | Следующая часть →

В этой части рассмотрим следующие валидаторы (6):

  • NotNull — значение не равно null.

  • Null — значение равно null.

  • NotEmpty — значение не равно null, пустой строке, пробелам, 0 элементам коллекции.

  • Empty — значение равно null, пустой строке, пробелам, 0 элементам коллекции

  • NotEqual — значение не равно определённому либо не равно указанному свойству.

  • Equal — значение равно определённому либо равно указанному свойству.

Список всех встроенных валидаторов (22):

  • NotNull

  • Null

  • NotEmpty

  • Empty 

  • NotEqual

  • Equal

  • Length 

  • MaximumLength 

  • MinimumLength 

  • LessThan 

  • LessThanOrEqual

  • GreaterThan

  • GreaterThanOrEqual

  • Must

  • Matches

  • EmailAddress

  • CreditCard

  • IsInEnum

  • IsEnumName

  • ExclusiveBetween

  • InclusiveBetween

  • PrecisionScale

Валидатор NotNull.

К списку валидаторов

Описание:

Гарантирует, что указанное свойство не равно значению null.
Исходный код валидатора

Пример кода:

// Модель адреса
public class Address
{
  // Фактический адрес
  public string? Actual { get; set; }
}

// Модель клиента
public class Customer
{
  // Адрес
  public Address? Address { get; set; }
}

// Валидатор для модели клиента
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    // Свойство Actual должно быть не равно null
    RuleFor(customer => customer.Address.Actual)
      .NotNull();
  }
}

// Здесь выполняем валидацию как обычно
static void Main(string[] args)
{
  ValidatorOptions.Global.LanguageManager.Culture = new CultureInfo("ru-RU");

  // Здесь задаём данные
  var customer = new Customer
  {
    Address = new()
    {
      Actual = null
    }
  };
  
  var validator = new CustomerValidator();
  var result = validator.Validate(customer);

  Console.WriteLine(result.ToString(Environment.NewLine));
}

Пример ошибки:

'Address Actual' должно быть заполнено.

Доступные заполнители:

{PropertyName} — название валидируемого свойства

{PropertyValue} — значение валидируемого свойства

{PropertyPath} — полный путь к свойству

Пример кода с заполнителями:

RuleFor(customer => customer.Address.Actual)
  .NotNull()
    .WithMessage("PropertyName: {PropertyName}\n" +
    "PropertyValue: {PropertyValue}\n" +
    "PropertyPath: {PropertyPath}");

Пример ошибки с заполнителями:

PropertyName: Address Actual
PropertyValue:
PropertyPath: Address.Actual

Валидатор Null.

К списку валидаторов

Описание:

Гарантирует, что указанное свойство равно значению null.
Исходный код валидатора

Пример кода:

// Модель адреса
public class Address
{
  // Фактический адрес
  public string? Actual { get; set; }
}

// Модель клиента
public class Customer
{
  // Адрес
  public Address? Address { get; set; }
}

// Валидатор для модели клиента
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    // Свойство Actual должно быть равно null
    RuleFor(customer => customer.Address.Actual)
      .Null();
  }
}

// Здесь выполняем валидацию как обычно
static void Main(string[] args)
{
  ValidatorOptions.Global.LanguageManager.Culture = new CultureInfo("ru-RU");

  // Здесь задаём данные
  var customer = new Customer
  {
    Address = new()
    {
      Actual = "SomeAddress"
    }
  };

  var validator = new CustomerValidator();
  var result = validator.Validate(customer);

  Console.WriteLine(result.ToString(Environment.NewLine));
}

Пример ошибки:

'Address Actual' должно быть пустым.

Доступные заполнители:

{PropertyName} — название валидируемого свойства

{PropertyValue} — значение валидируемого свойства

{PropertyPath} — полный путь к свойству

Пример кода с заполнителями:

RuleFor(customer => customer.Address.Actual)
  .Null()
    .WithMessage("PropertyName: {PropertyName}\n" +
    "PropertyValue: {PropertyValue}\n" +
    "PropertyPath: {PropertyPath}");

Пример ошибки с заполнителями:

PropertyName: Address Actual
PropertyValue: SomeAddress
PropertyPath: Address.Actual

Валидатор NotEmpty.

К списку валидаторов

Описание:

Гарантирует, что указанное свойство не равно значению null, пустой строке, пробелам либо дефолтным значениям для значимых типов, например, 0 для типа int. Если используется на типе IEnumerable, или производном от него (такие как массивы, коллекции и т. д.), валидатор гарантирует, что массив данных содержит хотя бы один элемент.
Исходный код валидатора

Пример кода:

// Модель адреса
public class Address
{
  // Фактический адрес
  public string? Actual { get; set; }
}

// Модель клиента
public class Customer
{
  // Адрес
  public Address? Address { get; set; }
}

// Валидатор для модели клиента
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    // Свойство Actual должно быть не равно null, пустой строке, пробелам
    RuleFor(customer => customer.Address.Actual)
      .NotEmpty();
  }
}

// Здесь выполняем валидацию как обычно
static void Main(string[] args)
{
  ValidatorOptions.Global.LanguageManager.Culture = new CultureInfo("ru-RU");

  // Здесь задаём данные
  var customer = new Customer
  {
    Address = new()
    {
      Actual = ""
    }
  };

  var validator = new CustomerValidator();
  var result = validator.Validate(customer);

  Console.WriteLine(result.ToString(Environment.NewLine));
}

Пример ошибки:

'Address Actual' должно быть заполнено.

Доступные заполнители:

{PropertyName} — название валидируемого свойства

{PropertyValue} — значение валидируемого свойства

{PropertyPath} — полный путь к свойству

Пример кода с заполнителями:

RuleFor(customer => customer.Address.Actual)
  .NotEmpty()
    .WithMessage("PropertyName: {PropertyName}\n" +
    "PropertyValue: {PropertyValue}\n" +
    "PropertyPath: {PropertyPath}");

Пример ошибки с заполнителями:

PropertyName: Address Actual
PropertyValue:
PropertyPath: Address.Actual

Валидатор Empty.

К списку валидаторов

Описание:

Гарантирует, что указанное свойство равно значению null, пустой строке, пробелам либо дефолтным значениям для значимых типов, например, 0 для типа int. Если используется на типе IEnumerable, или производном от него (такие как массивы, коллекции и т. д.), валидатор гарантирует, что массив данных не содержит элементов.
Исходный код валидатора

Пример кода:

// Модель адреса
public class Address
{
  // Фактический адрес
  public string? Actual { get; set; }
}

// Модель клиента
public class Customer
{
  // Адрес
  public Address? Address { get; set; }
}

// Валидатор для модели клиента
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    // Свойство Actual должно быть равно null, пустой строке, пробелам
    RuleFor(customer => customer.Address.Actual)
      .Empty();
  }
}

// Здесь выполняем валидацию как обычно
static void Main(string[] args)
{
  ValidatorOptions.Global.LanguageManager.Culture = new CultureInfo("ru-RU");

  // Здесь задаём данные
  var customer = new Customer
  {
    Address = new()
    {
      Actual = "value"
    }
  };

  var validator = new CustomerValidator();
  var result = validator.Validate(customer);

  Console.WriteLine(result.ToString(Environment.NewLine));
}

Пример ошибки:

'Address Actual' должно быть пустым.

Доступные заполнители:

{PropertyName} — название валидируемого свойства

{PropertyValue} — значение валидируемого свойства

{PropertyPath} — полный путь к свойству

Пример кода с заполнителями:

RuleFor(customer => customer.Address.Actual)
  .Empty()
    .WithMessage("PropertyName: {PropertyName}\n" +
    "PropertyValue: {PropertyValue}\n" +
    "PropertyPath: {PropertyPath}");

Пример ошибки с заполнителями:

PropertyName: Address Actual
PropertyValue: value
PropertyPath: Address.Actual

Валидатор NotEqual.

К списку валидаторов

Описание:

Гарантирует, что указанное свойство не равно определённому значению (или не равно значению другого указанного свойства).
Исходный код валидатора

Первый пример кода (не равно определённому значению):

// Модель клиента
public class Customer
{
  // Номер телефона клиента
  public string? PhoneNumber { get; set; }
}

// Валидатор для модели клиента
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    // Свойство PhoneNumber должно быть не равно значению "89998887766"
    RuleFor(customer => customer.PhoneNumber)
      .NotEqual("89998887766");
  }
}

// Здесь выполняем валидацию как обычно
static void Main(string[] args)
{
  ValidatorOptions.Global.LanguageManager.Culture = new CultureInfo("ru-RU");
  
  // Здесь задаём данные
  var customer = new Customer
  {
    PhoneNumber = "89998887766"
  };
  
  var validator = new CustomerValidator();
  var result = validator.Validate(customer);
  
  Console.WriteLine(result.ToString(Environment.NewLine));
}

Пример ошибки:

'Phone Number' не должно быть равно '89998887766'.

Второй пример кода (не равно значению другого указанного свойства):

// Модель клиента
public class Customer
{
  // Номер телефона клиента
  public string? PhoneNumber { get; set; }
  // Номер телефона третьего лица
  public string? ThirdPartyPhoneNumber { get; set; }
}
// Валидатор для модели клиента
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    // Свойство PhoneNumber должно быть не равно значению
    // свойства ThirdPartyPhoneNumber
    RuleFor(customer => customer.PhoneNumber)
      .NotEqual(customer => customer.ThirdPartyPhoneNumber);
  }
}
// Здесь выполняем валидацию как обычно
static void Main(string[] args)
{
  ValidatorOptions.Global.LanguageManager.Culture = new CultureInfo("ru-RU");
  
  // Здесь задаём данные
  var customer = new Customer
  {
    PhoneNumber = "89998887766",
    ThirdPartyPhoneNumber = "89998887766"
  };
  
  var validator = new CustomerValidator();
  var result = validator.Validate(customer);
  
  Console.WriteLine(result.ToString(Environment.NewLine));
}

Пример ошибки:

'Phone Number' не должно быть равно '89998887766'.

Доступные заполнители:

{PropertyName} — название валидируемого свойства

{PropertyValue} — значение валидируемого свойства

{PropertyPath} — полный путь к свойству

{ComparisonProperty} — название свойства, с которым происходит сравнение

{ComparisonValue} — значение, с которым происходит сравнение

Первый пример кода с заполнителями (не равно определённому значению):

RuleFor(customer => customer.PhoneNumber)
  .NotEqual("89998887766")
    .WithMessage("PropertyName: {PropertyName}\n" +
    "PropertyValue: {PropertyValue}\n" +
    "PropertyPath: {PropertyPath}\n" +
    "ComparisonProperty: {ComparisonProperty}\n" +
    "ComparisonValue: {ComparisonValue}");

Первый пример ошибки с заполнителями:

PropertyName: Phone Number
PropertyValue: 89998887766
PropertyPath: PhoneNumber
ComparisonProperty:
ComparisonValue: 89998887766

Второй пример кода с заполнителями (не равно значению другого указанного свойства):

RuleFor(customer => customer.PhoneNumber)
  .NotEqual(customer => customer.ThirdPartyPhoneNumber)
    .WithMessage("PropertyName: {PropertyName}\n" +
    "PropertyValue: {PropertyValue}\n" +
    "PropertyPath: {PropertyPath}\n" +
    "ComparisonProperty: {ComparisonProperty}\n" +
    "ComparisonValue: ");

Второй пример ошибки с заполнителями:

PropertyName: Phone Number
PropertyValue: 89998887766
PropertyPath: PhoneNumber
ComparisonProperty: Third Party Phone Number
ComparisonValue: 89998887766

Валидатор Equal.

К списку валидаторов

Описание:

Гарантирует, что указанное свойство равно определённому значению (или равно начению другого указанного свойства).
Исходный код валидатора

Первый пример кода (равно определённому значению):

// Модель адреса
public class Address
{
  // Фактический адрес
  public string? Actual { get; set; }
}

// Модель клиента
public class Customer
{
  // Адрес
  public Address? Address { get; set; }
}

// Валидатор для модели клиента
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    // Свойство Actual должно быть равно значению SomeAddress
    RuleFor(customer => customer.Address.Actual)
      .Equal("SomeAddress");
  }
}

// Здесь выполняем валидацию как обычно
static void Main(string[] args)
{
  ValidatorOptions.Global.LanguageManager.Culture = new CultureInfo("ru-RU");

  // Здесь задаём данные
  var customer = new Customer
  {
    Address = new()
    {
      Actual = "NotSomeAddress"
    }
  };

  var validator = new CustomerValidator();
  var result = validator.Validate(customer);

  Console.WriteLine(result.ToString(Environment.NewLine));
}

Пример ошибки:

'Address Actual' должно быть равно 'SomeAddress'.

Второй пример кода (равно значению другого указанного свойства):

// Модель клиента
public class Customer
{
  // Пароль
  public string? Password { get; set; }
  // Подтверждение пароля
  public string? PasswordConfirmation { get; set; }
}

// Валидатор для модели клиента
public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    // Значение свойства Password должно быть равно значению свойства
    // PasswordConfirmation
    RuleFor(customer => customer.Password)
      .Equal(customer => customer.PasswordConfirmation);
  }
}

// Здесь выполняем валидацию как обычно
static void Main(string[] args)
{
  ValidatorOptions.Global.LanguageManager.Culture = new CultureInfo("ru-RU");

  // Здесь задаём данные
  var customer = new Customer
  {
    Password = "qwerty1",
    PasswordConfirmation = "qwerty2"
  };

  var validator = new CustomerValidator();
  var result = validator.Validate(customer);

  Console.WriteLine(result.ToString(Environment.NewLine));
}

Пример ошибки:

'Password' должно быть равно 'qwerty2'.

Доступные заполнители:

{PropertyName} — название валидируемого свойства

{PropertyValue} — значение валидируемого свойства

{PropertyPath} — полный путь к свойству

{ComparisonProperty} — название свойства, с которым происходит сравнение

{ComparisonValue} — значение, с которым происходит сравнение

Первый пример кода с заполнителями (равно определённому значению):

RuleFor(customer => customer.Address.Actual)
  .Equal("SomeAddress")
    .WithMessage("PropertyName: {PropertyName}\n" +
    "PropertyValue: {PropertyValue}\n" +
    "PropertyPath: {PropertyPath}\n" +
    "ComparisonProperty: {ComparisonProperty}\n" +
    "ComparisonValue: {ComparisonValue}");

Первый пример ошибки с заполнителями:

PropertyName: Address Actual
PropertyValue: NotSomeAddress
PropertyPath: Address.Actual
ComparisonProperty:
ComparisonValue: SomeAddress

Второй пример кода с заполнителями (равно значению другого указанного свойства):

RuleFor(customer => customer.Password)
  .Equal(customer => customer.PasswordConfirmation)
    .WithMessage("PropertyName: {PropertyName}\n" +
    "PropertyValue: {PropertyValue}\n" +
    "PropertyPath: {PropertyPath}\n" +
    "ComparisonProperty: {ComparisonProperty}\n" +
    "ComparisonValue: {ComparisonValue}");

Второй пример ошибки с заполнителями:

PropertyName: Password
PropertyValue: qwerty1
PropertyPath: Password
ComparisonProperty: Password Confirmation
ComparisonValue: qwerty2

Можно указать тип сравнения через второй аргумент, с помощью перечисления StringComparer. По умолчанию стоит значение StringComparer.Ordinal (порядковое сравнение с учётом регистра):

// Cоответствует определённому значению (порядковое сравнение без учёта регистра)
RuleFor(customer => customer.Address.Actual)
  .Equal("SomeAddress", StringComparer.OrdinalIgnoreCase);

// Соответствует значению другого указанного свойства (порядковое сравнение без учёта регистра)
RuleFor(customer => customer.Password)
  .Equal(customer => customer.PasswordConfirmation, StringComparer.OrdinalIgnoreCase)

← Предыдущая часть | Следующая часть →

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 7: ↑2 и ↓5-1
Комментарии14

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн