Представьте, что у вас есть устаревший проект Asp.NET MVC версии 5, которому много лет. Он использует самописный ResourceProvider, который может извлекать ресурс из базы данных и отображать его в пользовательском интерфейсе.
В зависимости от различных условий (например, откуда пользователь пришел на сайт) ресурсы будут отображаться по-разному.
Теперь пришло время жестко закодировать все строки в атрибутах аннотаций данных, например:
также могли получить их значения с помощью ResourceProvider. Ниже я покажу вам, как это сделать, используя небольшое наследование и настройку, доступные в Asp.NET MVC. Вся необходимая логика для поиска именно того ресурса, который необходимо показать в текущей ситуации, инкапсулирована в класс Ресурспровайдер и связанные классы, поэтому нам просто нужно вызвать следующий метод:[Display(Name = "Username")] [Required(ErrorMessage = "Please enter the username")] [StringLength(64, ErrorMessage = "Username cannot exceed 64 characters")] public string Username{ get; set; }
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++
-
Каковы Основные Проблемы Intel?
19 Oct, 24