-1

Newbie.

I have a validation that ensures the Order's Total Sale is above $0. In the error message I need to include the Order ID.

Something like this

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

How do I access the "order.OrderId" inside the validation?

Ian Vink
  • 66,960
  • 104
  • 341
  • 555

1 Answers1

0

Use the overload that provides access to the instance:

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

There is a snip in the documentation about it:

enter image description here

Working LINQPad example:

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");
        });
    }
}

Output:

enter image description here

rgvlee
  • 2,773
  • 1
  • 13
  • 20