Метаданные и валидация модели

Последнее обновление: 31.10.2015

При работе с моделью в MVC большее значение играют метаданные. Они позволяют указать некоторую дополнительную информацию об объекте, например, о том, как отображать его свойства в представлении, или о том, как осуществлять валидацию вводимых данных.

Аннотации данных для отображения свойств

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Аннотации данных представляют собой атрибуты, которые вы можете найти в пространстве имен System.ComponentModel.DataAnnotations (хотя несколько атрибутов определено в других пространствах).

Атрибут Display

Итак, предположим у нас имеется некоторая модель 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 содержит строку, которая будет отображаться вместо имени свойства. Больше нам ничего не надо менять. Запустим и увидим новые названия:

Использование атрибутов в ASP.NET MVC 5

Атрибут HiddenInput

В предыдущем примере у нас осталась одна проблемка - это поле 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" />

Атрибут ScaffoldColumn

При редактировании модели атрибут HiddenInput полностью не скрывает поля, так как мы можем посмотреть исходный код страницы и найти соответствующие поля. Чтобы полностью скрыть свойство от хелперов, используется атрибут ScaffoldColumn:

[ScaffoldColumn(false)]
public int Id { get; set; }

Теперь хелперы редактирования не увидят данное свойство и не создадут для него даже скрытое поле на странице.

Атрибут DataType

Атрибут DataType позволяет предоставлять среде выполнения информацию об использовании свойства. Например, допустим, у нас есть свойство Password:

[DataType(DataType.Password)]
public string Password { get; set; }

Для свойства с атрибутом DataType.Password HTML-хелперы создают элемент ввода, у которого атрибут type имеет значение "password". Тогда в браузере вы при вводе данных вы не увидите вводимые символы, а вместо них будут выводиться точки.

Перечисление DataType может принимать несколько различных значений:

Значение

Описание

Currency

Отображает текст в виде валюты

DateTime

Отображает дату и время

Date

Отображает только дату, без времени

Time

Отображает только время

Text

Отображает однострочный текст

MultilineText

Отображает многострочный текст (элемент textarea)

Password

Отображает символы с использованием маски

Url

Отображает строку URL

EmailAddress

Отображает электронный адрес

Атрибут UIHint

Данный атрибут указывает, какой будет использоваться шаблон отображения при создании разметки 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; }
}

Тогда мы получим следующий результат:

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850