Неявная привязка моделей происходит, когда привязываемая модель является параметром для метода действия. Для сложных типов она использует рефлексию и рекурсию, чтобы сопоставить имена записываемых свойств модели с именами, которые содержатся в парах "имя-значение", отравленных методу действия. При наличии совпадения имен средство привязки применяет значение из пары "имя-значение", чтобы попробовать установить значение свойства. Если совпадение дают сразу несколько имен из пар "имя-значение", тогда используется значение первого совпавшего имени. Если имя не найдено, то свойство устанавливается в стандартное значение для его типа. Вот как выглядит порядок поиска пар "имя-значение":

• значения формы из HTTP-метода POST (включая отправки JavaScript AJAX);

• тело запроса (для контроллеров API);

• значения маршрута, предоставленные через маршрутизацию ASP.NET Core (для простых типов);

• значения строки запроса (для простых типов);

• загруженные файлы (для типов IFormFile).

Например, следующий метод будет пытаться установить все свойства в типе Car. Если процесс привязки завершается без ошибок, тогда свойство ModelState.IsValid возвращает true.

[HttpPost]

public ActionResult Create(Car entity)

{

  if (ModelState.IsValid)

  {

    // Сохранить данные.

  }

}

<p id="AutBody_Root1337"><strong>Явная привязка моделей</strong></p>

 Явная привязка моделей запускается с помощью вызова метода TryUpdateModelAsync с передачей ему экземпляра привязываемого типа и списка свойств, подлежащих привязке. Если привязка модели терпит неудачу, тогда метод возвращает false и устанавливает ошибки в ModelState аналогично неявной привязке. При использовании явной привязки моделей привязываемый тип не является параметром метода действия. Скажем, вы могли бы переписать предыдущий метод Create с применением явной привязки:

[HttpPost]

public async Task Create

{

  var vm = new Car;

  if (await TryUpdateModelAsync(vm,"",

     c=>c.Color,c=>c.PetName,c=>c.MakeId, c=>c.TimeStamp))

  {

    // Делать что-то важное.

  }

}

<p id="AutBody_Root1338"><strong>Атрибут Bind</strong></p>

Атрибут Bind в HTTP-методах POST позволяет ограничить свойства, которые участвуют в привязке модели, или установить префикс для имени в парах "имя-значение". Ограничение свойств, которые могут быть привязаны, снижает опасность атак избыточной отправкой (over-posting attack). Если атрибут Bind помещен на ссылочный параметр, то значения будут присваиваться через привязку модели только тем полям, которые перечислены в списке Include. Если атрибут Bind не используется, тогда привязку допускают все поля.

В следующем примере метода действия Create все поля экземпляра Car доступны для привязки, поскольку атрибут Bind не применяется:

[HttpPost]

[ValidateAntiForgeryToken]

public IActionResult Create(Car car)

{

  if (ModelState.IsValid)

  {

    // Добавить запись.

  }

    // Позволить пользователю повторить попытку.

}

Пусть в ваших бизнес-требованиях указано, что методу Create разрешено обновлять только поля PetName и Color. Добавление атрибута Bind (как показано в примере ниже) ограничивает свойства, участвующие в привязке, и инструктирует средство привязки моделей о том, что остальные свойства должны игнорироваться.

[HttpPost]

[ValidateAntiForgeryToken]

public ActionResult Create(

[Bind(nameof(Car.PetName),nameof(Car.Color))]Car car)

{

  if (ModelState.IsValid)

  {

    // Сохранить данные.

  }

    // Позволить пользователю повторить попытку.

}

Атрибут Bind можно также использовать для указания префикса имен свойств. Если имена в парах "имя-значение" имеют префикс, добавленный при их отправке методу действия, тогда атрибут Bind применяется для информирования средства привязки моделей о том, как сопоставлять эти имена со свойствами типа. Код в следующем примере устанавливает префикс для имен и позволяет привязывать все свойства:

[HttpPost]

[ValidateAntiForgeryToken]

public ActionResult Create(

[Bind(Prefix="MakeList")]Car car)

{

  if (ModelState.IsValid)

  {

    // Сохранить данные.

  }

}

<p id="AutBody_Root1339"><strong>Управление источниками привязки моделей в ASP.NET Core</strong></p>
Перейти на страницу:

Похожие книги