Перегрузка Стандартных Атрибутов Dataannotation Для Использования С Настраиваемым Поставщиком Ресурсов.

Представьте, что у вас есть устаревший проект Asp.NET MVC версии 5, которому много лет. Он использует самописный ResourceProvider, который может извлекать ресурс из базы данных и отображать его в пользовательском интерфейсе.

В зависимости от различных условий (например, откуда пользователь пришел на сайт) ресурсы будут отображаться по-разному.

Теперь пришло время жестко закодировать все строки в атрибутах аннотаций данных, например:

  
  
  
  
   

[Display(Name = "Username")] [Required(ErrorMessage = "Please enter the username")] [StringLength(64, ErrorMessage = "Username cannot exceed 64 characters")] public string Username{ get; set; }

также могли получить их значения с помощью ResourceProvider. Ниже я покажу вам, как это сделать, используя небольшое наследование и настройку, доступные в Asp.NET MVC. Вся необходимая логика для поиска именно того ресурса, который необходимо показать в текущей ситуации, инкапсулирована в класс Ресурспровайдер и связанные классы, поэтому нам просто нужно вызвать следующий метод:

string resource = ResourceProvider.GetResource(name);



Отображаемый атрибут

DisplayAttribute , представленный в .

NET Framework 4, в отличие от своего предшественника, DisplayNameAttribute , отмечено как запечатанный , поэтому в данном случае мы не сможем использовать магию наследования.

Здесь мы будем использовать тот факт, что Отображаемое имя также доступен в классе System.Web.Mvc.ModelMetadata .

Давайте создадим класс, который наследуется от DataAnnotationsModelMetadataProvider , давайте переопределим метод Создать метаданные заменить Отображаемое имя по полученному от Ресурспровайдер .

Мы используем Ninject в качестве контейнера IoC. Чтобы задать имя ресурса, давайте создадим собственный атрибут. Атрибут ДисплайРесаурцеаваре .



public class DisplayResourceAwareAttribute : Attribute { public string ResourceName { get; set; } public DisplayResourceAwareAttribute() { } } public class ResourceAwareMetadataProvider : DataAnnotationsModelMetadataProvider { [Inject] public ResourceProvider ResourceProvider { get; set; } protected override ModelMetadata CreateMetadata( IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) { var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); var displayNameAttr = attributes.SingleOrDefault(a => typeof(DisplayResourceAwareAttribute) == a.GetType()) as DisplayResourceAwareAttribute; if (displayNameAttr != null) { modelMetadata.DisplayName = ResourceProvider.GetResource(displayNameAttr.ResourceName); } return modelMetadata; } }

Приведенный выше код ищет среди атрибутов атрибут type. Атрибут ДисплайРесаурцеаваре , и если оно существует, то мы обновим свойство Отображаемое имя значение, полученное с помощью ResourceProvider.GetResource. Теперь нам придется использовать новый MetadataProvider вместо стандартного.

Для этого в методе Начало_приложения в файл Global.asax.cs добавьте следующую строку:

protected void Application_Start() { .

ModelMetadataProviders.Current = DependencyResolver.Current.GetService<ResourceAwareMetadataProvider>(); .

}

Теперь в модели мы можем избавиться от явно заданного описания поля, заменив стандартный атрибут на наш:

[DisplayResourceAware(ResourceName = "UsernameResource")] [Required(ErrorMessage = "Please enter the username")] [StringLength(64, ErrorMessage = "Username cannot exceed 64 characters")] public string Username{ get; set; }

Никаких дополнительных изменений в представлениях или контроллерах не требуется.



Атрибуты проверки

С атрибутами проверки, такими как Необходимый , длина строки и т. д. проще, потому что мы можем наследовать от них наши атрибуты и устанавливать свойство в конструкторе Сообщение об ошибке значение, которое нам нужно.

Теги: #asp.net mvc #C++ #.

NET #программирование #.

NET #ASP #ASP #C++

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.