Валидация ввода

Содержание

Слайд 2

Валидация в MVC Цель проверки ввода – не дать ошибкам пользователя

Валидация в MVC

Цель проверки ввода – не дать ошибкам пользователя далеко

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

Проверка ввода обязательно выполняется на стороне сервера и опционально на стороне клиента.

Слайд 3

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

Проверка, встроенная в модель

Чтобы модель могла сама себя валидировать,

она должна реализовать интерфейс IValidatableObject.
Слайд 4

Мероприятия в контроллере и в представлении В контроллере: В представлении:

Мероприятия в контроллере и в представлении

В контроллере:

В представлении:

Слайд 5

Декорирование свойств модели Другой способ встроить валидацию в модель – пометить свойства модели атрибутами.

Декорирование свойств модели

Другой способ встроить валидацию в модель – пометить свойства

модели атрибутами.
Слайд 6

Атрибуты DataAnnotations Required [Required(ErrorMessage="Требуется название картины")] public string PictureName { get;

Атрибуты DataAnnotations

Required
[Required(ErrorMessage="Требуется название картины")]
public string PictureName { get; set; }
StringLength
[StringLength(160, MinimumLength=3)]
public

string ArtistName { get; set; }
RegularExpression
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]
public string Email { get; set; }
Range
[Range(35,44)]
public int Age { get; set; }

Атрибуты валидации объявлены в пространствах System.Web.Mvc и
System.ComponentModel.DataAnnotations

Слайд 7

Атрибут Compare Позволяет сравнить значения двух свойств модели. [RegularExpression( @"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")] public

Атрибут Compare

Позволяет сравнить значения двух свойств модели.
[RegularExpression(
@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]
public string

Email { get; set; }
[Compare("Email")]
public string EmailConfirm { get; set; }

Находится в пространстве System.Web.Mvc

Слайд 8

Атрибут Remote [Remote("CheckUserName", "Account")] public string UserName { get; set; }

Атрибут Remote

[Remote("CheckUserName", "Account")]
public string UserName { get; set; }

public JsonResult CheckUserName(string

username)
{
var result = Membership.FindUsersByName(username).Count == 0;
return Json(result, JsonRequestBehavior.AllowGet);
}

Атрибут

Метод контроллера

CheckUserName – имя метода-действия, Account – имя контроллера.
Имя параметра метода должно совпадать с именем проверяемого свойства.

Находится в пространстве System.Web.Mvc.
Позволяет выполнить клиентскую проверку с помощью ajax-запроса к серверу

Слайд 9

Локализация сообщений об ошибках Каждый атрибут валидации имеет три именованных параметра

Локализация сообщений об ошибках

Каждый атрибут валидации имеет три именованных параметра

[Required(ErrorMessage

= "Your {0} is required.")]
[StringLength(160, ErrorMessage = "{0} is too long.")]
public string LastName { get; set; }

[Required(ErrorMessageResourceType = typeof(ErrorMessages),
ErrorMessageResourceName = "LastNameRequired")]
[StringLength(160, ErrorMessageResourceType = typeof(ErrorMessages),
ErrorMessageResourceName = "LastNameTooLong")]
public string LastName { get; set; }

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

ErrorMessageResourceType и ErrorMessageResourceName задают ресурс, в котором находится локализованное сообщение об ошибке.
Предполагается, что в приложении имеется файл ресурса ErrorMessages.resx, в котором есть два элемента с именами "LastNameRequired" и "LastNameTooLong".

Слайд 10

Привязка модели и валидация Привязка модели – это процесс определения значений

Привязка модели и валидация

Привязка модели – это процесс определения значений аргументов

методов-действий.
Привязка происходит неявно, но ее можно вызвать и явно при помощи методов UpdateModel() или TryUpdateModel().
Валидаторы, объявленные в атрибутах, срабатывают в процессе привязки модели.
Результатом привязки является объект ModelSatate - состояние модели

[HttpPost]
public ActionResult Create(Hall hall)
{
Hall h = new Hall();
UpdateModel(h);

}

Слайд 11

Состояние модели – ModelState MS содержит все значения, введенные пользователем в

Состояние модели – ModelState

MS содержит все значения, введенные пользователем в поля

формы.
MS содержит ошибки, ассоциированные с отдельными свойствами модели и с моделью в целом.
Например, пользователь сделал ошибку при вводе в поле LastName. Тогда:
ModelState.IsValid == false
ModelState.IsValidField("LastName") == false
ModelState["LastName"].Errors.Count > 0

var lastNameErrorMessage = ModelState["LastName"].Errors[0].ErrorMessage;

Сообщения об ошибках также находится в состоянии модели.

Слайд 12

Пользовательский атрибут валидации Для реализации пользовательской валидации есть два способа: проверка,

Пользовательский атрибут валидации

Для реализации пользовательской валидации есть два способа:
проверка, встроенная в

модель (IValidatableObject);
пользовательский атрибут аннотации.
Последний выбирают, кода хотят использовать проверку более, чем в одной модели.
Слайд 13

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

Пример атрибута валидации

Предположим, мы хотим ограничить год написания картины не

константой, а текущим годом.

// Атрибут проверяет, что значение не превышает текущего года.
//
public class UpToNowAttribute: ValidationAttribute
{
public UpToNowAttribute()
:base("{0} must be less than the current year.") {}
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
if (value != null)
{
int year = (int)value;
var errorMessage = FormatErrorMessage(validationContext.DisplayName);
if (year > DateTime.Now.Year)
return new ValidationResult(errorMessage);
}
return ValidationResult.Success;
}
}