Модели в ASP.NET Core MVC. Аннотации данных

Для того, чтобы установить правила отображения свойств модели в представлениях используются аннотации данных — специальные атрибуты, применяемые к свойствам модели. Эти атрибуты, как и большинство атрибутов валидации, располагаются в пространстве имен 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 отображает строку Url
  • MultilineText отображает многострочный текст (элемент 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 — хелперы редактирования создают однострочное текстовое поле — элемент input
  • EmailAddress — хелперы редактирования создают однострочное текстовое поле. Хелперы отображения генерируют элемент ссылка, где атрибут href имеет значение mailto:url
  • HiddenInput — создается скрытое поле — элемент hidden input
  • Html — хелперы редактирования создают однострочное текстовое поле. Хелперы отображения просто показывают текст
  • 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-кода страницы и т.д.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии