Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
С помощью атрибутов валидации модели мы можем управлять валидацией и заключать несложную логику проверки значений свойств уже в атрибуты этих свойств, не прибегая к коду. Рассмотрим атрибуты валидации, которые мы можем применить в приложении на ASP.NET Core.
Применение этого атрибута к свойству модели означает, что данное свойство должно быть обязательно установлено.
using System.ComponentModel.DataAnnotations; namespace ValidationApp.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 этого атрибута можно настроить выводимое при валидации сообщение. А если мы явным образом не установим текст сообщения, то при выводе ошибки будет отображаться стандартный текст сообщения.
Как можно заметить, у свойства int Age
не используется атрибут Required, тем не менее если мы не укажем для него значение, оно не пройдет валидацию.
Потому что для свойств тех типов данных, которые не могут принимать значение null
, нам в любом случае надо предоставить значение, как в случае со свойством Age.
Поэтому для него использовать атрибут Required необязательно.
Использование данного атрибута предполагает, что вводимое значение должно соответствовать указанному в этом атрибуте регулярному выражению.
Наиболее распространенный пример - это проверка адреса электронной почты на корректность. Например, класс модели содержит свойство Email
:
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "Некорректный адрес")] public string Email { get; set; }
Если введенное значение не будет соответствовать регулярному выражению, то будет отображено сообщение об ошибке:
Чтобы пользователь не мог ввести очень длинный текст, применяется атрибут 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; } }
Атрибут Range определяет минимальные и максимальные ограничения для числовых данных.
[Range(1, 110, ErrorMessage = "Недопустимый возраст")] public int Age { get; set; }
Атрибут Compare гарантирует, что два свойства объекта модели имеют одно и то же значение. Если, например, надо, чтобы пользователь ввел пароль дважды:
[Required] public string Password { get; set; } [Compare("Password", ErrorMessage = "Пароли не совпадают")] public string PasswordConfirm { get; set; }
Если пользователь введет второй раз другой пароль, отличный от первого, то он увидит ошибку:
Выше мы применяли регулярное выражение для проверки адреса электронной почты. Проверки на корректность электронной почты, адреса url, номера телефона и кредитной карты довольно часто встречаются, что для них определены специальные атрибуты:
[CreditCard]
[EmailAddress]
[Phone]
[Url]
Например:
[EmailAddress (ErrorMessage = "Некорректный адрес")] public string Email { get; set; }
Атрибут 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); } // остальное содержимое контроллера }
В данном случае метод должен возвращать объект JsonResult. Если переданное через параметр значение будет равно или "admin@mail.ru", или "aaa@gmail.com", значит, валидация не пройдена, поэтому отправляем в ответ false. Иначе отправляем true.