Обзор библиотеки FluentValidation. Часть 7.1. Встроенные валидаторы
В этой части рассматриваются следующие валидаторы:
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
{
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
{
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
{
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
{
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
{
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
{
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
{
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
{
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)
← Предыдущая часть