Для того, чтобы установить правила отображения свойств модели в представлениях используются аннотации данных — специальные атрибуты, применяемые к свойствам модели. Эти атрибуты, как и большинство атрибутов валидации, располагаются в пространстве имен 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, что и хелперы редактирования, только с атрибутомdisabledCollection— используется соответствующий шаблон для рендеринга каждого элемента коллекции. Причем элементы могут быть разных типов.Decimal— хелперы редактирования создают однострочное текстовое поле — элемент inputEmailAddress— хелперы редактирования создают однострочное текстовое поле. Хелперы отображения генерируют элемент ссылка, где атрибутhrefимеет значениеmailto:urlHiddenInput— создается скрытое поле — элемент 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-кода страницы и т.д.



