Атрибуты валидации

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

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

Атрибут Required

Применение этого атрибута к свойству модели означает, что данное свойство должно быть обязательно установлено. Допустим, у нас есть следующая модель Person

using System.ComponentModel.DataAnnotations;

namespace MvcApp.Models
{
    public class Person
    {
        [Required (ErrorMessage = "Не указано имя")]
        public string? Name { get; set; }
        [Required (ErrorMessage = "Не указан электронный адрес")]
        public string? Email { get; set; }
        [Required]
        public string? Password { get; set; }
        public int Age { get; set; }
    }
}

С помощью свойства ErrorMessage этого атрибута можно настроить выводимое при валидации сообщение. А если мы явным образом не установим текст сообщения, то при выводе ошибки будет отображаться стандартный текст сообщения.

Допустим, для ввода данных этой модели будет применяться следующее представление:

@model MvcApp.Models.Person
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<form method="post">
    <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="Email">Email</label><br />
            <input type="text" asp-for="Email" />
            <span asp-validation-for="Email"  />
        </p>
        <p>
            <label asp-for="Password">Password</label><br />
            <input type="text" asp-for="Password" />
            <span asp-validation-for="Password"  />
        </p>
        <p>
            <label asp-for="Age">Age</label><br />
            <input asp-for="Age" />
            <span asp-validation-for="Age" />
        </p>
        <p>
            <input type="submit" value="Send"  />
        </p>
    </div>
</form>

<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.5.1.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.17.0/jquery.validate.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.10/jquery.validate.unobtrusive.min.js"></script>
Атрибут Required в ASP.NET Core MVC и C#

Как можно заметить, у свойства int Age не используется атрибут Required, тем не менее если мы не укажем для него значение, оно не пройдет валидацию. Потому что для свойств тех типов данных, которые не могут принимать значение null, нам в любом случае надо предоставить значение, как в случае со свойством Age. Поэтому для него использовать атрибут Required необязательно.

Атрибут RegularExpression

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

Наиболее распространенный пример - это проверка адреса электронной почты на корректность. Например, класс модели содержит свойство Email:

[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "Некорректный адрес")]
public string? Email { get; set; }

Если введенное значение не будет соответствовать регулярному выражению, то будет отображено сообщение об ошибке:

Атрибут RegularExpression в ASP.NET Core MVC и C#

Атрибут StringLength

Чтобы пользователь не мог ввести очень длинный текст, применяется атрибут StringLength. Первым параметром в конструкторе атрибута идет максимальная допустимая длина строки. Именованные параметры, в частности MinimumLength и ErrorMessage, позволяют задать дополнительные опции отображения.

public class Person
{
    [Required (ErrorMessage = "Не указано имя")]
    [StringLength(50, MinimumLength = 3, ErrorMessage = "Длина строки должна быть от 3 до 50 символов")]
    public string? Name { get; set; }

    [Required (ErrorMessage = "Не указан электронный адрес")]
    public string? Email { get; set; }

    [Required]
    public string? Password { get; set; }

    public int Age { get; set; }
}
Атрибут StringLength в ASP.NET Core MVC и C#

Атрибут Range

Атрибут Range определяет минимальные и максимальные значения для числовых данных.

[Range(1, 110, ErrorMessage = "Недопустимый возраст")]
public int Age { get; set; }

Атрибут Compare

Атрибут Compare гарантирует, что два свойства объекта модели имеют одно и то же значение. Если, например, надо, чтобы пользователь ввел пароль дважды:

[Required]
public string? Password { get; set; }

[Compare("Password", ErrorMessage = "Пароли не совпадают")]
public string? PasswordConfirm { get; set; }

Если пользователь введет второй раз другой пароль, отличный от первого, то он увидит ошибку:

Проверка ввода пароля в ASP.NET Core MVC и C#

Специальные атрибуты

Выше мы применяли регулярное выражение для проверки адреса электронной почты. Проверки на корректность электронной почты, адреса url, номера телефона и кредитной карты довольно часто встречаются, что для них определены специальные атрибуты:

  • [CreditCard]

  • [EmailAddress]

  • [Phone]

  • [Url]

Например:

[EmailAddress (ErrorMessage = "Некорректный адрес")]
public string? Email { get; set; }

Атрибут Remote

Атрибут Remote из пространства имен Microsoft.AspNetCore.Mvc; для валидации свойства выполняет запрос на сервер к определенному методу контроллера. И если требуемый метод контроллера вернет значение false, то валидация не пройдена. Например:

[Remote(action: "CheckEmail", controller: "Home", ErrorMessage ="Email уже используется")]
public string Email { get; set; }

В данном случае указано, что для проверки значения атрибут будет обращаться к методу CheckEmail контроллера Home. Теперь определим этот метод:

public class HomeController : Controller
{
    [AcceptVerbs("Get", "Post")]
    public IActionResult CheckEmail(string email)
    {
        if (email == "admin@mail.ru" || email == "aaa@gmail.com")
            return Json(false);
        return Json(true);
    }
	
    public IActionResult Create() => View();

    [HttpPost]
    public IActionResult Create(Person person)
    {
        if (ModelState.IsValid)
            return Content($"{person.Name} - {person.Age}");
        return View(person);
    }
}

В данном случае метод должен возвращать объект JsonResult. Если переданное через параметр значение будет равно или "admin@mail.ru", или "aaa@gmail.com", значит, валидация не пройдена, поэтому отправляем в ответ false. Иначе отправляем true.

Удаленная валидация Remote Validation в ASP.NET Core MVC и C#
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850