Привязка моделей представляет собой процесс, в рамках которого инфраструктура ASP.NET Core использует пары "имя-значение", отправленные НТТР-методом POST, для присваивания значений свойствам моделей. Для привязки к ссылочному типу пары "имя-значение" берутся из значений формы или тела запроса, ссылочные типы обязаны иметь открытый стандартный конструктор, а свойства, участвующие в привязке, должны быть открытыми и допускать запись. При присваивании значений везде, где это применимо, используются неявные преобразования типов (вроде установки значения свойства string
int). Если преобразование типа терпит неудачу, тогда такое свойство помечается как имеющее ошибку Прежде чем начать подробное обсуждение привязки, важно понять предназначение словаря ModelState и его роль в процессе привязки (а также проверки достоверности).Словарь ModelState
Словарь ModelState
ModelState.IsValid в false. Если всем нужным свойствам были успешно присвоены значения, тогда механизм привязки устанавливает ModelState.IsValid в true.На заметку!
Проверка достоверности модели, которая тоже устанавливает записи словаряModelState, происходит после привязки модели. Как неявная, так и явная привязка модели автоматически вызывает проверку достоверности для модели. Проверка достоверности рассматривается в следующем разделе.Добавление специальных ошибок в словарь ModelState
В дополнение к свойствам и ошибкам, добавляемым механизмом привязки, в словарь ModelState
PetName сущности Car), применяйте такой код:ModelState.AddModelError("PetName","Name is required");
Чтобы добавить ошибку для целой модели, указывайте в качестве имени свойства string.Empty
ModelState.AddModelError(string.Empty, $"Unable to create record: {ex.Message}");
Неявная привязка моделей
Неявная привязка моделей происходит, когда привязываемая модель является параметром для метода действия. Для сложных типов она использует рефлексию и рекурсию, чтобы сопоставить имена записываемых свойств модели с именами, которые содержатся в парах "имя-значение", отравленных методу действия. При наличии совпадения имен средство привязки применяет значение из пары "имя-значение", чтобы попробовать установить значение свойства. Если совпадение дают сразу несколько имен из пар "имя-значение", тогда используется значение первого совпавшего имени. Если имя не найдено, то свойство устанавливается в стандартное значение для его типа. Вот как выглядит порядок поиска пар "имя-значение":
• значения формы из 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