FluentValidation, как включить имя родительского свойства в сообщение об исключении дочернего валидатора

RuleFor(getEligibleShippingDetails => getEligibleShippingDetails.ShipFromAddress)
 .NotNull()
 .WithMessage("Ship from address is required.")
 .SetValidator(shippingFromAddressValidator.FluentValidator)

Я получаю исключение

Исключение: Неверный запрос на получение услуг по доставке. "Email" не должно быть пустым. Адрес электронной почты требуется.

В сообщении не указывается, что это была проверка свойства ShipFromAddress.

Конечно, я могу передать справочное сообщение дочернему валидатору, например "Отправка с адреса", однако, возможно, есть более элегантный способ сделать это.

Пробовал что-то подобное,

RuleFor(getEligibleShippingDetails => getEligibleShippingDetails.ShipFromAddress)
.NotNull()
.WithMessage("Ship from address is required.")
.SetValidator(shippingFromAddressValidator.FluentValidator)
.WithMessage("Invalid ship from address.")

Однако последнее сообщение было проигнорировано.

Любой совет.

1 ответ

Дочерняя модель должна иметь ссылку на родительскую модель, потому что в FlueentValidation нет специальных средств для этой цели:

public class Parent
{
    public int Id {get;set;}
    public Child ChildModel {get;set;}
}

public class Child
{
    public string Name {get;set;}
    public Parent ParentModel {get;set;}
}

public class ChildValidator : AbstractValidator<Child>
{
    public ChildValidator()
    {
        RuleFor(x => x.Name)
            .NotNull()
            .WithMessage("Name should not be null for child of {0}'s parent", (model, value) => model.Parent.Id)
    }
}

Если вы используете MVC - просто реализуйте ModelBinder, это установит свойство Parent для child.

Другие вопросы по тегам