Книга: ASP.NET MVC Framework
Классы метаданных
Классы метаданных
Существуют сценарии, когда аннотирование классов не представляется возможным, например, когда класс является автогенерируемым классом контекста данных Linq To Sql. Кроме того, вероятны сценарии, когда получение данных аннотации необходимо производить не с помощью атрибутов System.ComponentModel.DataAnnotations
, а из других источников: базы данных или файлов XML.
Для поддержки таких сценариев в ASP.NET MVC введен механизм классов метаданных. Класс метаданных представляет собой обычный класс, служащий только для одной цели — предоставлять дополнительные данные — метаданные — о другом классе. Для примера добавим к нашему классу Product
класс с метаданными, вынеся все данные аннотации в метакласс (листинг 9.9).
Листинг 9.9. Класс с метаданными для класса Product
namespace TemplatedHelpersProject.Models {
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
[MetadataType (typeof (ProductMetadata)) ]
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Cost { get; set; }
public DateTime UpdatedAt { get; set; }
}
public class ProductMetadata
{
[DisplayName("Идентификатор")]
[HiddenInput]
public int Id { get; set; }
[DisplayName("Наименование товара")]
[Required(ErrorMessage = "Не указано наименование")]
public string Name { get; set; }
[DisplayName("Описание")]
public string Description { get; set; }
[DisplayName("Цена")]
[Required(ErrorMessage="Не указана цена")]
public decimal Cost { get; set; }
[DisplayName("Дата обновления")]
[HiddenInput(DisplayValue=false)]
public DateTime UpdatedAt { get; set; }
}
}
Обратите внимание на выделенную строку [MetadataType(typeof (ProductMetadata))].
Атрибут MetadataType
используется для того, чтобы показать механизму ASP.NET MVC, в каком классе следует искать метаданные. После выполнения кода мы убедимся, что перемещение метаданных из класса Product
в класс ProductMetadata
никак не отразилось на результате. Данные метаинформации стали потребляться из класса ProductMetadata
, что и требовалось достичь.
- 9.8. Классы в ECMAScript 5
- 9.1. Классы и прототипы
- Классы сертификатов
- Статические классы
- Извлечение метаданных
- 9.7.4. Иерархии классов и абстрактные классы
- Классы синхронизации, внедренные в версии .NET Framework 4.0
- Классы для программирования графики
- У14.6 Отложенные классы и прототип
- Совет 38. Проектируйте классы функторов для передачи по значению
- Классы обобщенных коллекций
- Представление метаданных компоновочного блока