Я пытаюсь выяснить, как связать внешний контекст параметра Action с настраиваемыми атрибутами проверки. У меня есть следующие модели:
public class DataValueValidator : ValidationAttribute
{
/// Create messages that include Guid Id
}
public class Data
{
[DataValueValidator]
public string DataValue { get; set; }
}
public class Envelope
{
public Guid Id { get; set; }
public Data Instance { get; set; }
}
Действие Web API выглядит следующим образом:
public async Task<IActionResult> Save(
[FromBody] IList<Envelope> envelopes)
{
look at ModelState to return error messages
}
Я хочу, чтобы сообщения об ошибках, созданные DataValueValidatorAttribute
, имели идентификатор (Guid) из экземпляра Envelope.
В различных методах DataValueValidatorAttribute
, которые я могу перегрузить, у меня есть доступ к объекту Data
, к которому относится свойство DataValue
, но не к экземпляру DataEnvelope
.
Я могу придумать пару вариантов, ни один из которых не кажется очень хорошим.
Первый - вручную вызвать все методы проверки из действия контроллера. Затем я мог бы взять ValidationResult, возвращенный из атрибута, и изменить сообщение об ошибке. Похоже, что подобное поражение цели использования атрибута ValidationAttribute.
Я также думал об использовании некоторого типа локального хранилища потоков для хранения Dictionary<Guid, Data>
, а затем извлекал словарь в DataValueValidator
. Я не люблю это использовать, так как в будущем нелегко рассуждать или поддерживать.
Каков наилучший способ передачи контекста в глубоко вложенные объекты во время проверки ASP.NET Core?