Pull to refresh

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

Level of difficultyMedium
Reading time9 min
Views1.2K

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

  • NotNull (значение не равно null)

  • Null (значение равно null)

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

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

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

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

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

  • 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)

Предыдущая часть

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 7: ↑2 and ↓5-1
Comments14

Articles