#c# #asp.net-mvc #data-annotations
#c# #asp.net-mvc #данные-аннотации
Вопрос:
Моя задача — выполнить проверку формы, поля которой создаются динамически (при запросе к базе данных). Я хотел бы использовать аннотации данных. Пока модель динамическая, я не могу украсить свойства аннотациями, но я могу использовать пользовательский поставщик метаданных, например, наследующий от DataAnnotationsModelMetadataProvider.
Просто в global.asax при Application_start я предоставил свой собственный MetaDataProvider:
ModelMetadataProviders.Current = new MetadataProvider.CustomModelMetadataProvider();
Я сделал небольшой взлом, вызвав ModelMetadataProviders.Current для каждого приложения, моя проблема заключалась в обслуживании разных метаданных в каждом запросе, но это было не так сложно.
Это отлично подходит для эмуляции атрибута IsRequired, поскольку поставщик метаданных использует System.Web.Mvc.ModelMetadata и есть свойство IsRequired , но нет такого свойства, как RegularExpression или что-либо подобное.
Итак, я запустил debugger и посмотрел на ModelMetadata, возвращаемый исходным DataAnnotationsModelMetadataProvider для свойства с атрибутом RegularExpression, и я все равно не нашел там регулярного выражения.
Я хотел бы получить несколько советов по этому поводу.
Ответ №1:
Я понял ответ (путем проверки исходного кода MVC 3), который заключается в следующем:
- создайте пользовательский
ModelValidatorProvider
, например, наследуя отDataAnnotationsModelValidatorProvider
- переопределить
GetValidators
метод - добавьте вашего пользовательского поставщика в
ModelValidatorProviders
.Коллекция поставщиков
GetValidators
метод возвращает, IEnumerable<ModelValidator>
поэтому его достаточно, чтобы вернуть, RegularExpressionAttributeAdapter
который унаследован от ModelValidator
.