Один из способов сделать это — «передать» идентификатор родительского объекта с помощью данных корневого контекста, но это доступно только в валидаторе элемента с использованием специального правила... что мне в этом не нравится, так это то, что я не могу использовать встроенные валидаторы с последовательными сообщениями об ошибках. Вот код, который я пробовал, но он не работает:
Код: Выделить всё
public class Order
{
public int OrderId { get; set; }
public List Items { get; set; }
}
public class Item
{
public string ItemDescription { get; set; }
}
public class OrderValidator : AbstractValidator
{
protected override bool PreValidate(ValidationContext context, ValidationResult result)
{
if (context.InstanceToValidate == null)
{
result.Errors.Add(new ValidationFailure("", "Please ensure a model was supplied."));
return false;
}
context.RootContextData["ParentId"] = context.InstanceToValidate.OrderId;
return true;
}
public OrderValidator()
{
RuleForEach(x => x.Items).SetValidator(new ItemValidator());
}
}
public class ItemValidator : AbstractValidator
{
public ItemValidator()
{
RuleFor(x => x.ItemDescription).Custom((item, context) =>
{
var parentId = int.Parse(context.RootContextData["ParentId"].ToString());
// Can't do RuleFor in custom, gives:
// System.InvalidOperationException
// Collection was modified; enumeration operation may not execute.
RuleFor(item => item.ItemDescription).NotNull();
});
}
}
Подробнее здесь: https://stackoverflow.com/questions/762 ... dating-a-c
Мобильная версия