Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Рассмотрим атрибуты, которые используются для валидации модели в приложении на ASP.NET MVC.
Применение этого атрибута к свойству модели означает, что данное свойство должно быть обязательно установлено.
Чтобы при валидации мы не получали несуразных сообщений об ошибке, этот атрибут позволяет настроить текст сообщения:
public class Book { [HiddenInput(DisplayValue = false)] public int Id { get; set; } [Required(ErrorMessage = "Поле должно быть установлено")] [Display(Name = "Название")] public string Name { get; set; } [Required] [Display(Name = "Автор")] public string Author { get; set; } [Required] [Display(Name = "Год")] public int Year { get; set; } }
А если мы явным образом не установим текст сообщения, то при выводе ошибки будет отображаться стандартный текст сообщения.
Использование данного атрибута предполагает, что вводимое значение должно соответствовать указанному в этом атрибуте регулярному выражению.
Наиболее распространенный пример - это проверка адреса электронной почты на корректность. Например, класс модели содержит свойство 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 Book { [HiddenInput(DisplayValue = false)] public int Id { get; set; } [Required(ErrorMessage = "Поле должно быть установлено")] [StringLength(50, MinimumLength = 3, ErrorMessage = "Длина строки должна быть от 3 до 50 символов")] [Display(Name = "Название")] public string Name { get; set; } [Required] [Display(Name = "Автор")] public string Author { get; set; } [Required] [Display(Name = "Год")] public int Year { get; set; } }
Атрибут Range определяет минимальные и максимальные ограничения для числовых данных.
[Display(Name = "Год")] [Range(1700,2000,ErrorMessage="Недопустимый год")] public int Year { get; set; }
Атрибут Range
может работать как с целочисленными значениями, так и с числами с плавающей точкой.
А еще одна перегруженная версия его конструктора принимает параметр Type и две строки (которые позволяют создать диапазон возрастов).
[Range(typeof(decimal), "0.00", "49.99")] public decimal Price { get; set; }
Атрибут Compare гарантирует, что два свойства объекта модели имеют одно и то же значение. Если, например, надо, чтобы пользователь ввел пароль дважды:
[DataType(DataType.Password)] public string Password { get; set; } [Compare("Password",ErrorMessage="Пароли не совпадают")] [DataType(DataType.Password)] public string PasswordConfirm { get; set; }
Если пользователь введет второй раз другой пароль, отличный от первого, то он увидит ошибку:
Таким образом, используя атрибуты валидации модели, мы можем управлять валидацией и заключать несложную логику проверки значений свойств уже в атрибуты свойств, не прибегая к коду.
Атрибут Remote в отличие от других классов атрибутов находится в пространстве имен System.Web.Mvc. Он позволяет выполнять валидацию на стороне клиента с обратными вызовами на сервер.
Например, название книги, представленое свойством Name
, не должно быть равно определенному значению.
При валидации на стороне клиента трудно гарантировать соблюдение ряда проверок, особенно если мы задействуем базы данных.
А с помощью атрибута Remote мы можем послать значение свойства Name
на сервер, а там уже проверить.
public class Book { [Required] [Remote("CheckName", "Home", ErrorMessage = "Name is not valid.")] public string Name { get; set; } }
В атрибуте можно установить имя действия и имя контроллера, которые должны вызываться кодом на стороне клиента, а также еще ряд именованных параметров,
в частности, сообщение об ошибке с помощью параметра ErrorMessage
. Клиентский код посылает
введенное пользователем значение для свойства Name
автоматически, а перегруженный конструктор атрибута позволяет указать
дополнительные поля, значения которых надо посылать на сервер.
[HttpGet] public JsonResult CheckName(string name) { var result = !(name=="Название"); return Json(result, JsonRequestBehavior.AllowGet); }
Это действие контроллера принимает в качестве параметра имя свойства, подлежащего валидации, и возвращает true или false в форме объекта в формате JSON. При этом если возвращается false, то мы увидим сообщение об ошибке, заданное парааметром ErrorMessage.