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

Основы валидации

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

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

Важную роль в ASP.NET Core играет валидация входных данных. Валидация позволяет проверить входные данные на наличие неправильных, корректных значений и должным образом обработать эти значения.

Для рассмотрения валидации создадим новый проект ASP.NET Core по типу ASP.NET Core Web App (Model-View-Controller), который назовем ValidationApp. Вначале добавим в проект новую папку Models для моделей и определим в ней одну единственную модель - класс Person:

using System.ComponentModel.DataAnnotations;

namespace ValidationApp.Models
{
    public class Person
    {
        [Required]
        public string Name { get; set; }
        [Required]
        public string Email { get; set; }
        [Required]
        public string Password { get; set; }
        public int Age { get; set; }
    }
}

Здесь каждое свойство модели помечено атрибутом Required, который находится в пространстве имен System.ComponentModel.DataAnnotations.

Затем определим в контроллере HomeController действие Create, через которое мы будем добавлять на сервер объект модели Person:

public class HomeController : Controller
{
    public IActionResult Create()
    {
        return View();
    }
    [HttpPost]
    public IActionResult Create(Person person)
    {
        if (ModelState.IsValid)
            return Content($"{person.Name} - {person.Email}");
        else
            return View(person);
    }
}

Если данные для модели были введены правильно, то через метод Content() эти данные будут выведены в браузере. Если же были введены некорректные данные, то возвращаем объект Person в метод View.

Далее определим само представление Create.cshtml, которое будет содержать форму для ввода данных:

@model ValidationApp.Models.Person

<form asp-antiforgery="true" asp-action="Create" asp-controller="Home">
    <div>
        <div class="validation" asp-validation-summary="ModelOnly"></div>
        <div>
            <label asp-for="Name"></label><br />
            <input type="text" asp-for="Name" />
            <span asp-validation-for="Name"></span>
        </div>
        <div>
            <label asp-for="Email"></label><br />
            <input asp-for="Email" />
            <span asp-validation-for="Email"></span>
        </div>
        <div>
            <label asp-for="Password"></label><br />
            <input asp-for="Password" />
            <span asp-validation-for="Password"></span>
        </div>
        <div>
            <label asp-for="Age"></label><br />
            <input asp-for="Age" />
            <span asp-validation-for="Age"></span>
        </div>
        <div>
            <input type="submit" value="Save"  />
        </div>
    </div>
</form>


@section scripts{

	<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
	<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
}

Это стандартное строго типизированное представление, которое использует tag-хелперы для создания полей для свойств модели Person. И кроме того, здесь определена секция scripts. В этой секции подключаются скрипты клиентской валидации либо из внешних CDN, либо непосредственно из проекта. В частности, в папке wwwroot/lib по умолчанию уже добавлены соответствующие скрипты:

Скрипты валидации в ASP.NET Core

И поскольку эти скрипты зависят от библиотеки jquery, то нам надо подключать их именно после этой библиотеки. На мастер-странице _Layout.cshtml jquery уже подключена, и после ее подключения определена секция scripts, поэтому в представлении Create.cshtml подключение скриптов клиентской валидации определено именно в секции scripts.

<script src="~/lib/jquery/dist/jquery.min.js"></script><!--подключение jquery-->
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@RenderSection("Scripts", required: false)      <!--подключение скриптов валидации после jquery-->

Хотя это необязательно, главное, чтобы перед этими скриптами была подключена jquery.

Теперь запустим приложение и обратимся к методу Create. И ничего не вводя в поля ввода, нажмем на кнопку отправки:

Основы валидации в ASP.NET Core

По факту форма даже не отправляется, а справа от поле ввода мы увидим сообщения о необходимости ввода данных.

В данном случае мы задействовали механизм валидации, который используется в mvc по умолчанию. Каковы же основные моменты валидации в данном случае:

  1. Использование атрибутов валидации при объявлении модели. Мы указали для каждого свойства атрибут Required, благодаря чему фреймворк знает, что данное свойство обязательно должно содержать некоторое значение.

  2. Использование tag-хелперов валидации. При каждом свойстве мы используем хелпер валидации <span asp-validation-for="[Название свойства]" />:

    <div>
        <label asp-for="Name"></label><br />
        <input type="text" asp-for="Name" />
        <span asp-validation-for="Name" />
    </div>
    

    Благодаря чему и отображается сообщение об ошибке.

  3. Использование скриптов валидации в представлении:

    <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
    

    Несмотря на то что, в принципе валидация может работать и без этих скриптов, однако же эти скрипты позволяют валидировать значение прямо на клиенте без их отправки на сервер

    В Visual Studio 2019 в папку Views/Shared по умолчанию добавляется частичное представление _ValidationScriptsPartial.cshtml, которое уже содержит подключение вышеопределенных скриптов. Поэтому вместо прямого подключения скриптов можно подключать данное частичное представление. Что очень удобно. Особенно если потом потребуется поменять версию скриптов, то достаточно будет изменить код одного частичного представления, которое подключается на остальные представления, использующие клиентскую валидацию.

  4. Валидация на стороне сервера. Если у пользователя отключен javascript а браузере, или в представлении не добавлены скрипты клиентской валидации, то форма благополучно отправится на сервер. Но во фреймворке предусмотрена также валидация на стороне сервера:

    if (ModelState.IsValid)
        return Content($"{person.Name} - {person.Email}");
    else
        return View(person);
    

    С помощью свойства ModelState.IsValid мы узнаем, проходит модель валидацию или нет, и зависимости от результата совершаем те или иные действия.

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