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

Введение в привязку моделей

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

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

В предыдущих главах мы рассмотрели модели и узнали, как передавать в методы контроллера значения из представлений. Но за кадром остался весь механизм, который способствует сопоставлению значений с используемыми в методах контроллера параметрами. И этот механизм называется привязкой модели.

Чтобы понять смысл привязки, посмотрим на примере. Допустим, мы отправляем на сервер форму с некоторыми данными для модели Book. И в некотором методе контроллера мы можем получить переданные данные из формы:

[HttpPost]
public ActionResult Edit()
{
    Book b = new Book();
    b.Name = Request.Form["Name"];
    b.Author = Request.Form["Author"];
    // .........
}

Однако свойств модели Book, которые надо получить из запроса, может быть множество. Кроме того, вы можете заметить, что поля для ввода свойств модели имеют имя (атрибут name), совпадающее с именем свойства модели. Чтобы облегчить процесс получения присланных данных и был создан механизм привязки. Благодаря чему мы можем просто написать:

[HttpPost]
public ActionResult Edit(Book b)
{
    //.........
}

При этом привязка модели не ограничена POST-запросами и сложными параметрами типа объекта Book. Привязка может также работать и с более простыми параметрами, например со следующим действием Edit, обрабатывающим HTTP-запрос GET:

public ActionResult Edit(int id)
{
    // ...
}

Привязчики моделей

После сопоставления запроса с некоторым маршрутом контролллеров вызываются специальные компоненты - активаторы действий (action invoker), которые вызывают нужное действие контроллера и передают в него значения из контекста запроса. А чтобы сопоставить полученные значения с конкретными параметрами активаторы действий, в частности, активатор по умолчанию - ControllerActionInvoker, используют привязчики модели (model binder). Привязчики моделей и осуществляют собственно привязку.

Все привязчики моделей должны реализовать интерфейс IModelBinder:

public interface IModelBinder
{
	object BindModel (ControllerContext controllerContext, 
						ModelBindingContext bindingContext);
}

В принципе для каждого отдельного типа может существовать свой привязчик модели. При просмотре параметров метода действия активатор действий ищет для каждого типа параметра соответствующий привязчик и вызывает его метод BindModel. В случае, если соответствующего данному типу привязчика не обнаружится, то используется привязчик по умолчанию - DefaultModelBinder.

Затем привязчик использует специальные компоненты - поставщики значений (value provider) для поиска значений в различных частях запроса.

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