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

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

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

Рассмотрим атрибуты, участвующие в валидации модели на примере проекта приложения, созданного в прошлом параграфе данной главы.

Атрибут Required

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

Чтобы при валидации мы не получали несуразных сообщений об ошибке, этот атрибут позволяет настроить текст сообщения:

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

Чтобы пользователь не мог ввести очень длинный текст, используется атрибут 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; }
    }
	

Атрибут RegularExpression

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

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

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

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

Атрибут Range

Атрибут 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

Атрибут 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

Атрибут 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; }

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

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