При работе с моделью в MVC большее значение играют метаданные. Они позволяют указать некоторую дополнительную информацию об объекте, например, о том, как отображать его свойства в представлении, или о том, как осуществлять валидацию вводимых данных.
Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Аннотации данных представляют собой атрибуты, которые вы можете найти в пространстве имен System.ComponentModel.DataAnnotations
(хотя несколько атрибутов определено в других пространствах).
Итак, предположим у нас имеется некоторая модель Book:
public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public int Year { get; set; } }
И мы пытаемся получить из базы данных один объект этой модели:
public class HomeController : Controller { BookContext db = new BookContext(); public ActionResult Index() { var firstBook = db.Books.FirstOrDefault(); return View(firstBook); } }
Используя соответствующий хелпер, мы выводим эту модель представлении: @Html.DisplayForModel()
:
@model DataAnnotations.Models.Book @{ ViewBag.Title = "Книга"; } @Html.DisplayForModel()
Обычный код, но тут мы сталкиваемся с проблемой:
Как видно, заголовки у свойств точно такие же, как и названия свойств, что не очень удобно. Ведь мы могли назвать свойства как угодно. К тому же мы не хотим, чтобы названия на русскоязычном сайте были на английском языке.
Конечно, в этом случае мы могли бы использовать @Html.LabelFor
для настройки названия для каждого отдельного свойства, но в этом случае у нас бы увеличился в несколько раз объем кода, и мы не смогли бы одной строкой
вывести всю информацию о модели. К тому же может потребоваться в нескольких представлениях выводить информацию о модели. Поэтому данный подход не оптимален.
И тут нам на помощь приходят аннотации данных, а именно атрибут Display. Нам достаточно поправить модель, указав у нее параметры отображения:
using System.ComponentModel.DataAnnotations; ........................................... public class Book { public int Id { get; set; } [Display(Name = "Название")] public string Name { get; set; } [Display(Name = "Автор")] public string Author { get; set; } [Display(Name = "Год")] public int Year { get; set; } }
Свойство Name
атрибута Display содержит строку, которая будет отображаться вместо имени свойства.
Больше нам ничего не надо менять. Запустим и увидим новые названия:
В предыдущем примере у нас осталась одна проблемка - это поле Id. Иногда, конечно, может потребоваться вывод поля Id. Но, например,
если бы мы выводили модель в режиме редактирования с помощью хелпера @Html.EditorForModel()
, то данное поле было бы доступно для редактирования,
что не очень хорошо, особенно когда идентификаторы не должны меняться. Чтобы скрыть это поле мы можем применить атрибут HiddenInput:
using System.ComponentModel.DataAnnotations; using System.Web.Mvc; ........................................... public class Book { [HiddenInput (DisplayValue=false)] public int Id { get; set; } [Display(Name = "Название")] public string Name { get; set; } [Display(Name = "Автор")] public string Author { get; set; } [Display(Name = "Год")] public int Year { get; set; } }
Свойство DisplayValue=false
указывает, что надо скрыть данное поле. В итоге вы его не увидите:
При использовании хелперов редактирования (Html.EditorFor/Html.EditorForModel
) для данного свойства будет сгенерировано
скрытое поле: <input type="hidden" id="Id" name="Id" value="1" />
При редактировании модели атрибут HiddenInput полностью не скрывает поля, так как мы можем посмотреть исходный код страницы и найти соответствующие поля. Чтобы полностью скрыть свойство от хелперов, используется атрибут ScaffoldColumn:
[ScaffoldColumn(false)] public int Id { get; set; }
Теперь хелперы редактирования не увидят данное свойство и не создадут для него даже скрытое поле на странице.
Атрибут DataType позволяет предоставлять среде выполнения информацию об использовании свойства. Например, допустим, у нас есть свойство Password:
[DataType(DataType.Password)] public string Password { get; set; }
Для свойства с атрибутом DataType.Password HTML-хелперы создают элемент ввода, у которого атрибут type имеет значение "password". Тогда в браузере вы при вводе данных вы не увидите вводимые символы, а вместо них будут выводиться точки.
Перечисление DataType может принимать несколько различных значений:
Значение | Описание |
| Отображает текст в виде валюты |
| Отображает дату и время |
| Отображает только дату, без времени |
| Отображает только время |
| Отображает однострочный текст |
| Отображает многострочный текст (элемент textarea) |
| Отображает символы с использованием маски |
| Отображает строку URL |
| Отображает электронный адрес |
Данный атрибут указывает, какой будет использоваться шаблон отображения при создании разметки html для данного свойства. Шаблон управляет, как свойство будет рендерится на странице.
Имеются следующие встроенные шаблоны:
Boolean
Хелперы редактирования создают флажок (checkbox) для булевых значений. Для значений типа bool? (nullable) создается элемент select с параметрами True, False и Not Set
Хелперы отображения генерируют те же элементы html, что и хелперы редактирования, только с атрибутом disabled
Collection
Используется соответствующий шаблон для рендеринга каждого элемента коллекции. Причем элементы могут быть разных типов.
Decimal
Хелперы редактирования создают однострочное текстовое поле - элемент input
EmailAddress
Хелперы редактирования создают однострочное текстовое поле.
Хелперы отображения генерируют элемент ссылка, где атрибут href
имеет значение mailto:url
HiddenInput
Создается скрытое поле - элемент hidden input
Html
Хелперы редактирования создают однострочное текстовое поле.
Хелперы отображения просто показывают текст
MultilineText
Хелперы редактирования создают многострочное текстовое поле (элемент textarea)
Object
Хелперы изучают свойства объекта и выбирают наиболее подходящие для него шаблоны.
Password
Хелперы редактирования создают текстовое поле для ввода символов с использованием маски
Хелперы отображения показывают пароль как есть, без использования маски
String
Хелперы редактирования создают однострочное текстовое поле
Url
Хелперы редактирования создают текстовое поле
Хелперы отображения создают элемент ссылки для данного Url
Например, используем последний шаблон Url:
public class Book { [HiddenInput(DisplayValue = false)] public int Id { get; set; } [Display(Name = "Название")] [UIHint("Url")] public string Name { get; set; } [Display(Name = "Автор")] public string Author { get; set; } [Display(Name = "Год")] public int Year { get; set; } }
Тогда мы получим следующий результат:
Таким образом, мы можем управлять отображением свойств модели в представлении.