FluentValidations:WithMessage 以包含父数据?

时间:2021-03-19 22:36:23

标签: fluentvalidation

新手。

我有一个验证,可确保订单的总销售额高于 0 美元。在错误消息中,我需要包含订单 ID。

像这样

        RuleForEach(x => x.Orders).ChildRules(order =>
        {
            order.RuleFor(x => x.TotalSale)
                      .GreaterThan(0)
                      .WithMessage($"{order.orderId}: Total Sales must be greater than $0");

如何访问验证中的“order.OrderId”?

1 个答案:

答案 0 :(得分:0)

使用提供对实例的访问的重载:

.WithMessage(o => $"{o.OrderId}: Total Sales must be greater than $0");

documentation 中有一段关于它的片段:

enter image description here

工作 LINQPad 示例:

void Main()
{
    var orders = new List<Order>();
    orders.Add(new Order { OrderId = Guid.NewGuid(), TotalSale = 0 });
    orders.Add(new Order { OrderId = Guid.NewGuid(), TotalSale = 5 });
    orders.Add(new Order { OrderId = Guid.NewGuid(), TotalSale = 10 });
    var customer = new Customer() { Orders = orders };

    Console.WriteLine(customer);

    var validator = new CustomerValidator();
    var validationResult = validator.Validate(customer);
    Console.WriteLine(validationResult.Errors.Select(x => x.ErrorMessage));
}

public class Customer
{
    public List<Order> Orders { get; set; }
}

public class Order
{
    public Guid OrderId { get; set; }
    public Decimal TotalSale { get; set; }
}

public class CustomerValidator : AbstractValidator<Customer>
{
    public CustomerValidator()
    {
        RuleForEach(x => x.Orders).ChildRules(order =>
        {
            order.RuleFor(x => x.TotalSale)
                      .GreaterThan(0)
                      .WithMessage(o => $"{o.OrderId}: Total Sales must be greater than $0");
        });
    }
}

输出:

enter image description here