Для того, чтобы установить правила отображения свойств модели в представлениях используются аннотации данных — специальные атрибуты, применяемые к свойствам модели. Эти атрибуты, как и большинство атрибутов валидации, располагаются в пространстве имен System.ComponentModel.DataAnnotations.
Атрибут Display
Атрибут Display
задает параметры отображения для свойства. Например, вернемся к нашему приложению из предыдущей части. В нём определена следующая модель:
namespace ASpValidationClientSide.Models { public class Person : IValidatableObject { public string Name { get; set; } public string Email { get; set; } public int Age { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { List<ValidationResult> errors = new(); if (string.IsNullOrEmpty(Name)) errors.Add(new ValidationResult("Поле Name обязательно к заполнению", new List<string>() { "Name" })); if ((Age <= 0)||(Age>100)) errors.Add(new ValidationResult("Возраст должен находиться в пределах от 1 до 100 лет", new List<string>() { "Age" })); if (string.IsNullOrEmpty(Email)) errors.Add(new ValidationResult("Поле Email обязательно к заполнению", new List<string>() { "Email" })); return errors; } } }
и представление для работы с этой моделью:
@model Person @{ ViewData["Title"] = "Home Page"; } <form method="post"> <div asp-validation-summary="All"></div> <div> <p> <label asp-for="Name">Name</label><br /> <input type="text" asp-for="Name" /> <span asp-validation-for="Name" /> </p> <p> <label asp-for="Age">Age</label><br /> <input asp-for="Age" /> <span asp-validation-for="Age" /> </p> <p> <label asp-for="Email">Email</label><br /> <input asp-for="Email" /> <span asp-validation-for="Email" /> </p> <p> <input type="submit" value="Send" /> </p> </div> </form> <div class="text-center"> <h1 class="display-4">Welcome</h1> <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.3/jquery.validate.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.12/jquery.validate.unobtrusive.js"></script>
В запущенном приложении веб-форма выглядит следующим образом:
Текст над полями ввода задается в метках label, что бывает не совсем удобно. Внесем следующие изменения:
удалим текст меток из представления:
<form method="post"> <div asp-validation-summary="All"></div> <div> <p> <label asp-for="Name"></label><br /> <input type="text" asp-for="Name" /> <span asp-validation-for="Name" /> </p> <p> <label asp-for="Age"></label><br /> <input asp-for="Age" /> <span asp-validation-for="Age" /> </p> <p> <label asp-for="Email"></label><br /> <input asp-for="Email" /> <span asp-validation-for="Email" /> </p> <p> <input type="submit" value="Send" /> </p> </div> </form>
Добавим к полям модели атрибут Display
public class Person : IValidatableObject { [Display(Name ="Имя")] public string Name { get; set; } [Display(Name = "Адрес электронной почты")] public string Email { get; set; } [Display(Name = "Возраст")] public int Age { get; set; } ...
Теперь запустим приложение и увидим изменения в отображении свойств:
Атрибут DataType
Атрибут DataType
позволяет предоставлять среде выполнения информацию об использовании свойства. Перечисление DataType
значение которого передается в параметры атрибута может принимать несколько различных значений:
CreditCard
— отображает номер кредитной картыCurrency
— отображает текст в виде валютыDate
— отображает только дату, без времениDateTime
— отображает дату и времяTime
— отображает только времяDuration
— отображает число — некоторую продолжительностьEmailAddress
— отображает электронный адресPassword
— отображает символы с использованием маскиPhoneNumber
— отображает номер телефонаPostalCode
— отображает почтовый индексImageUrl
— представляет путь к изображениюUrl
— отображает строку UrlMultilineText
— отображает многострочный текст (элемент textarea)Text
— отображает однострочный текст
Например, добавим в модель Person
сведения о дне рождения
public class Person : IValidatableObject { ... [Display(Name = "День рождения")] [DataType(DataType.Date)] public DateTime Birthday { get; set; } ...
Внесем изменение в представление:
<form method="post"> ... <p> <label asp-for="Birthday"></label><br /> <input asp-for="Birthday" /> <span asp-validation-for="Birthday" /> </p> <p> <input type="submit" value="Send" /> </p> </div> </form>
Результат в приложении:
Атрибут UIHint
Данный атрибут указывает, какой будет использоваться шаблон отображения при создании разметки html для данного свойства. Шаблон управляет, как будет происходить рендеринг свойства на странице при использовании шаблонных хэлперов.
В ASP.NET Core MVC могут использоваться следующие встроенные шаблоны:
Boolean
— хелперы редактирования создают флажок (checkbox) для булевых значений. Для значений типаbool?
(nullable) создается элемент select с параметрамиTrue
,False
иNot Set
. Хелперы отображения генерируют те же элементы html, что и хелперы редактирования, только с атрибутомdisabled
Collection
— используется соответствующий шаблон для рендеринга каждого элемента коллекции. Причем элементы могут быть разных типов.Decimal
— хелперы редактирования создают однострочное текстовое поле — элемент inputEmailAddress
— хелперы редактирования создают однострочное текстовое поле. Хелперы отображения генерируют элемент ссылка, где атрибутhref
имеет значениеmailto:url
HiddenInput
— создается скрытое поле — элемент hidden inputHtml
— хелперы редактирования создают однострочное текстовое поле. Хелперы отображения просто показывают текстMultilineText
— хелперы редактирования создают многострочное текстовое поле (элемент textarea)Object
— хелперы изучают свойства объекта и выбирают наиболее подходящие для него шаблоны.Password
— хелперы редактирования создают текстовое поле для ввода символов с использованием маски. Хелперы отображения показывают пароль как есть, без использования маскиString
— хелперы редактирования создают однострочное текстовое полеUrl
— хелперы редактирования создают текстовое поле
Чтобы продемонстрировать работу этого атрибута, заменим форму в представлении на следующий html-хэлпер:
@Html.DisplayForModel()
Теперь добавим к свойствам модели атрибут UIHint
:
public class Person : IValidatableObject { [Display(Name ="Имя")] [UIHint("String")] public string Name { get; set; } [UIHint("EmailAddress")] [Display(Name = "Адрес электронной почты")] public string Email { get; set; } [UIHint("Decimal")] [Display(Name = "Возраст")] public int Age { get; set; } [UIHint("Object")] [Display(Name = "День рождения")] [DataType(DataType.Date)] public DateTime Birthday { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { List<ValidationResult> errors = new(); if (string.IsNullOrEmpty(Name)) errors.Add(new ValidationResult("Поле Name обязательно к заполнению", new List<string>() { "Name" })); if ((Age <= 0)||(Age>100)) errors.Add(new ValidationResult("Возраст должен находиться в пределах от 1 до 100 лет", new List<string>() { "Age" })); if (string.IsNullOrEmpty(Email)) errors.Add(new ValidationResult("Поле Email обязательно к заполнению", new List<string>() { "Email" })); return errors; } }
В контроллере HomeController
изменим действие Index()
следующим образом:
[HttpGet] public IActionResult Index() { var person = new Person { Name = "admin", Age = 30, Birthday = new DateTime(1983, 12, 01), Email = "admin@mail.ru", }; return View(person); }
Теперь запустим приложение и посмотрим на результат:
Атрибут ScaffoldColumn
Атрибут ScaffoldColumn
позволяет скрыть отображение свойства при использовании хелперов Html.DisplayForModel()
и Html.EditorForModel()
.
Итого
Аннотации данных позволяют указать ASP.NET Core MVC правила отображения свойств моделей в представлении. Например, мы можем указать как должно отображаться имя свойства, указать правила рендеринга свойств при генерации html-кода страницы и т.д.