Книга: 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, что и требовалось достичь.

Оглавление книги


Генерация: 1.152. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз