Цель: Я хочу изменить определения проверки во время выполнения. Например: пометьте свойство как обязательное.
ModelMetaDataProvider:
Необходимо отключить механизм кэширования из DefaultModelMetaProvier, как описано здесь: Получение IMetadataDetailsProviders для запуска Больше чем Один раз в ASP. NET Core
=> Отлично, проверка на стороне сервера работает! (Вы можете переопределить флаг ValidationMetadata.IsRequired)
Но подождите, а как насчет клиент-проверки (визуализировал атрибуты из неубрушающей проверки, такие как данные-требуются ...)? Он также кэшируется реализацией ClientValidatorCache . (В этом классе нет виртуальных методов или определенного интерфейса)
Поэтому я создал класс, унаследованный от DefaultValidationHtmlAttributeProvider и переопределил метод AddValidationAttributes . Новая реализация вызывает my CustomClientValidatorCache с реализацией, которая не учитывает кэш.
Это очень уродливо и должен быть намного лучший способ сделать это sh.
Итак, заключительные вопросы:
-> Как я могу зарегистрировать свою собственную реализацию для ClientValidatorCache
или есть лучший способ добиться этого? цель?
(я создал тест-репо, где вы можете увидеть мое текущее плохое «решение»): https://github.com/orphisAG/DynamicValidationTest/tree/master/DynamicValidationTest
Ссылки:
ClientValidatorCache
DefaultValidationHtmlAttributeProvider
(редактировать: Добавить-ссылки)
Еще одна попытка:
Создайте ClientModelValidatorProvider (IClientModelValidatorProvider) и установите для IsReusable значение false.
Результат:
Это работает, только если вы измените ValidationMetaData с первоначальный существующий Validator . Потому что ClientValidatorCache вернет кэшированный начальный результат;).