Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Рассмотрим атрибуты, участвующие в валидации модели на примере проекта приложения, созданного в прошлом параграфе данной главы.
Применение этого атрибута к свойству модели означает, что данное свойство должно быть обязательно установлено.
Чтобы при валидации мы не получали несуразных сообщений об ошибке, этот атрибут позволяет настроить текст сообщения:
public class Book { [ScaffoldColumn(false)] public virtual int Id { get; set; } [Required (ErrorMessage="Поле должно быть установлено")] [Display(Name = "Название")] public virtual string Name { get; set; } [Required] [Display(Name = "Автор")] public virtual string Author { get; set; } [Required] [Display(Name = "Год")] public virtual int Year { get; set; } }
Таким образом, если мы явным образом не установим текст сообщения, то при выводе ошибки будет отображаться стандартный текст сообщения.
Чтобы пользователь не мог ввести очень длинный текст, используется атрибут StringLength
.
Особенно это актуально, если в базе данных установлено ограничение на размер хранящихся строк.
Первым параметром идет максимальная допустимая длина строки.
Именованные параметры, в частности MinimumLength
и ErrorMessage
, позволяют задать дополнительные опции отображения.
public class Book { [ScaffoldColumn(false)] public virtual int Id { get; set; } [Required (ErrorMessage="Поле должно быть установлено")] [StringLength (50, MinimumLength=3,ErrorMessage="Длина строки должна быть от 3 до 50 символов")] [Display(Name = "Название")] public virtual string Name { get; set; } [Required] [StringLength(50)] [Display(Name = "Автор")] public virtual string Author { get; set; } [Required] [Display(Name = "Год")] public virtual int Year { get; set; } }
Применение данного атрибута предполагает, что вводимое значение должно соответствовать указанному в этом атрибуте регулярному выражению.
Наиболее распространенный пример - это проверка корректности адреса электронной почты. Допустим, в некоторой модели у нас есть свойство Email
:
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "Некорректный адрес")] public virtual string Email { get; set; }
Если введенное значение не будет соответствовать регулярному выражению, то будет отображено сообщение об ошибке
Атрибут Range определяет минимальные и максимальные ограничения для числовых данных.
[Display(Name = "Год")] [Range(1700,2000,ErrorMessage="Недопустимый год")] public virtual int Year { get; set; }
Атрибут Range
может работать как с целочисленными значениями, так и с числами с плавающей точкой.
А еще одна перегруженная версия его конструктора принимает параметр Type и две строки (которые позволяют создать диапазон возрастов).
[Range(typeof(decimal), "0.00", "49.99")] public decimal Price { get; set; }
Атрибут Remote в отличие от предыдущих атрибутов находится в пространстве имен System.Web.Mvc. Он позволяет выполнять валидацию на стороне клиента с обратными вызовами на сервер.
Например, два пользователя не могут одновременно иметь одно и тоже значение UserName
.
Но с помощью валидации на стороне клиента трудно гарантировать, что введенное значение будет уникальным.
А с помощью атрибута Remote мы можем послать значение свойства UserName
на сервер, а там оно уже сравнивается со значениями, находящимися в базе данных.
[Remote("CheckUserName", "Account")] public string UserName { get; set; }
В атрибуте можно установить имя действия и имя контроллера, которые должны вызываться кодом на стороне клиента. Клиентский код посылает
введенное пользователем значение для свойства UserName
автоматически, а перегруженный конструктор атрибута позволяет указать
дополнительные поля, значения которых надо посылать на сервер.
public JsonResult CheckUserName(string username) { var result = Membership.FindUsersByName(username).Count == 0; return Json(result, JsonRequestBehavior.AllowGet); }
Это действие контроллера принимает в качестве параметра имя свойства, подлежащего валидации, и возвращает true или false в форме объекта в формате JSON.
Атрибут Compare также находится в пространстве имен System.Web.Mvc. Он гарантирует, что два свойства объекта модели имеют одно и то же значение. Если, например, надо, чтобы пользователь ввел пароль дважды:
[DataType(DataType.Password)] public virtual string Password { get; set; } [Compare("Password",ErrorMessage="Пароли не совпадают")] [DataType(DataType.Password)] public virtual string PasswordConfirm { get; set; }
Если пользователь введет второй раз другой пароль, отличный от первого, то он увидит ошибку: