Да, используя валидаторы по умолчанию, можно добавить другие значения свойств из объектов в сообщение.
Это можно сделать, используя перегрузку WithMessage, которая принимает лямбда-выражение, а затем Передача значений в строку. Формат или с помощью строковой интерполяции.
Источник
Есть несколько способов сделать это. Во-первых, согласно вашей текущей реализации, использующей Must
:
public class TestClassValidator : AbstractValidator<TestClass>
{
public TestClassValidator()
{
RuleForEach(x => x.TestProperties)
.Must(y => !string.IsNullOrEmpty(y.Name))
.WithMessage((testClass, testProperty) => $"TestProperty {testProperty.Id} name can't be null or empty");
}
}
Я стараюсь по возможности избегать использования Must
, если вы придерживаетесь встроенных валидаторов, у вас больше шансов на проверка стороны работает из коробки (если вы используете ее в веб-приложении). Использование ChildRules
позволяет вам использовать встроенные валидаторы, а также получить преимущество от использования свободного интерфейса:
public class TestClassValidator : AbstractValidator<TestClass>
{
public TestClassValidator()
{
RuleForEach(x => x.TestProperties)
.ChildRules(testProperties =>
{
testProperties.RuleFor(testProperty => testProperty.Name)
.NotNull()
.NotEmpty()
.WithMessage(testProperty => $"TestProperty {testProperty.Id} name can't be null or empty");
});
}
}
ChildRules doco
У меня есть включил валидатор NotNull () для многословия / выравнивания с пользовательским сообщением об ошибке, однако это не требуется, поскольку NotEmpty () будет охватывать пустой или пустой регистр.
Наконец, если бы это был я, я, вероятно, создал бы отдельный валидатор для типа Properties
(это должно быть Property
?) и используйте SetValidator
для его включения. Разбивает вопросы валидации, определяет валидацию для типа один раз, делает правила многократно используемыми и облегчает тестирование валидаторов. Я не буду описывать это здесь, поскольку это выходит за рамки этого вопроса, но ссылки ниже дают примеры того, как это сделать.
дочерний валидатор doco (SetValidator
использование) здесь и здесь
Рабочие образцы вышеуказанных, включая тесты, можно найти здесь .