Динамическая проверка формы — эмуляция атрибута RegularExpressionAttribute в CustomMetadataProvider

#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), который заключается в следующем:

  1. создайте пользовательский ModelValidatorProvider , например, наследуя от DataAnnotationsModelValidatorProvider
  2. переопределить GetValidators метод
  3. добавьте вашего пользовательского поставщика в ModelValidatorProviders .Коллекция поставщиков

GetValidators метод возвращает, IEnumerable<ModelValidator> поэтому его достаточно, чтобы вернуть, RegularExpressionAttributeAdapter который унаследован от ModelValidator .