Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
В предыдущих главах мы рассмотрели модели и узнали, как передавать в методы контроллера значения из представлений. Но за кадром остался весь механизм, который способствует сопоставлению значений с используемыми в методах контроллера параметрами. И этот механизм называется привязкой модели.
Чтобы понять смысл привязки, посмотрим на примере. Допустим, мы отправляем на сервер форму с некоторыми данными для модели 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) для поиска значений в различных частях запроса.