Неявная привязка моделей происходит, когда привязываемая модель является параметром для метода действия. Для сложных типов она использует рефлексию и рекурсию, чтобы сопоставить имена записываемых свойств модели с именами, которые содержатся в парах "имя-значение", отравленных методу действия. При наличии совпадения имен средство привязки применяет значение из пары "имя-значение", чтобы попробовать установить значение свойства. Если совпадение дают сразу несколько имен из пар "имя-значение", тогда используется значение первого совпавшего имени. Если имя не найдено, то свойство устанавливается в стандартное значение для его типа. Вот как выглядит порядок поиска пар "имя-значение":
• значения формы из HTTP-метода POST (включая отправки JavaScript AJAX);
• тело запроса (для контроллеров API);
• значения маршрута, предоставленные через маршрутизацию ASP.NET Core (для простых типов);
• значения строки запроса (для простых типов);
• загруженные файлы (для типов IFormFile
).
Например, следующий метод будет пытаться установить все свойства в типе Car
. Если процесс привязки завершается без ошибок, тогда свойство ModelState.IsValid
возвращает true
.
[HttpPost]
public ActionResult Create(Car entity)
{
if (ModelState.IsValid)
{
// Сохранить данные.
}
}
Явная привязка моделей
Явная привязка моделей запускается с помощью вызова метода TryUpdateModelAsync
с передачей ему экземпляра привязываемого типа и списка свойств, подлежащих привязке. Если привязка модели терпит неудачу, тогда метод возвращает false
и устанавливает ошибки в ModelState
аналогично неявной привязке. При использовании явной привязки моделей привязываемый тип не является параметром метода действия. Скажем, вы могли бы переписать предыдущий метод Create
с применением явной привязки:
[HttpPost]
public async Task
{
var vm = new Car;
if (await TryUpdateModelAsync(vm,"",
c=>c.Color,c=>c.PetName,c=>c.MakeId, c=>c.TimeStamp))
{
// Делать что-то важное.
}
}
Атрибут Bind
Атрибут 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)
{
// Сохранить данные.
}
}
Управление источниками привязки моделей в ASP.NET Core
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT