#c# #asp.net #asp.net-core #asynchronous #custom-attributes
#c# #asp.net #asp.net-core #асинхронный #пользовательские атрибуты
Вопрос:
У меня есть асинхронный метод, который оценивает поле.
Task<bool> MyMethod(object obj);
Я хочу создать атрибут пользовательской проверки, который использует вышеуказанный метод.
Моя проблема в том, что ValidationAttribute
класс не поддерживает асинхронные методы.
Обычно я переопределяю следующий метод:
ValidationResult IsValid (object? obj, ValidationContext validationContext);
Но результат моего асинхронного метода Task<ValidationResult>
, и я не хочу использовать синхронный метод.
У вас есть решение или предложение?
Совет: я хочу использовать асинхронный метод из-за блокировки ввода-вывода. (Нет привязки к процессору или тяжелых операций.)
Комментарии:
1. Должно быть, в
MyMethod
выполняется довольно сложная проверка.2. @Enigmativity Нет, проблема в блокировке ввода-вывода.
3. Да, ввод-вывод был бы сложной проверкой.
Ответ №1:
Использовать метод async в атрибуте пользовательской проверки
Конвейер проверки не является асинхронным, поэтому его невозможно использовать для этой цели. Смотрите этот аналогичный поток.
Кроме того, как мы все знаем, проверка заключается в обеспечении правильности типа и значения, а не бизнес-правил, таких как оценка поля. Это должно быть применено на вашем бизнес-уровне / уровне данных, и вы могли бы попробовать использовать проверку jQuery или удаленный атрибут.
Ответ №2:
Вам нужно будет выбрать, тогда, если атрибут ValidationAttribute не поддерживает вызовы async / await, вам, возможно, придется перейти на синхронный режим, иначе у вас может быть вызов в вашем isValid метода async, но тогда он не будет заблокирован, и вы можете получить неверный результат.
Я не вижу никакого способа обойти это, поскольку вам нужно будет почти сразу узнать, является ли что-то действительным или недействительным. Вероятно, это причина, по которой атрибут ValidationAttribute их не распознает.
Вы могли бы изменить свою модель, а не расширять, и иметь событие isValidChecked или событие IsInvalid, которое запускается при изменении деталей из async, а затем что-то делать, когда эти события запускаются.