Как передать контекст пользовательским атрибутам ValidationAttributes для глубоко вложенных объектов в ASP.NET Core? - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь выяснить, как связать внешний контекст параметра 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...