Язык программирования C#9 и платформа .NET5
Класс ControllerBase
Класс
обеспечивает основную функциональность для веб-приложений и служб ASP.NET Core, и вдобавок предлагает вспомогательные методы для возвращения кодов состояния HTTP. В табл. 29.2 описана основная функциональность классаControllerBase, а в табл. 29.3 перечислены некоторые вспомогательные методы для возвращения кодов состояния HTTP.ControllerBaseДействия
Действия — это методы в контроллере, которые возвращают экземпляр типа
(илиIActionResultдля асинхронных операций) либо класса, реализующегоTask<IActionResult>, такого какIActionResultилиActionResult. Действия будут подробно рассматриваться в последующих главах.ViewResultПривязка моделей
Привязка моделей представляет собой процесс, в рамках которого инфраструктура ASP.NET Core использует пары "имя-значение", отправленные НТТР-методом POST, для присваивания значений свойствам моделей. Для привязки к ссылочному типу пары "имя-значение" берутся из значений формы или тела запроса, ссылочные типы обязаны иметь открытый стандартный конструктор, а свойства, участвующие в привязке, должны быть открытыми и допускать запись. При присваивании значений везде, где это применимо, используются неявные преобразования типов (вроде установки значения свойства
в значениеstring). Если преобразование типа терпит неудачу, тогда такое свойство помечается как имеющее ошибку Прежде чем начать подробное обсуждение привязки, важно понять предназначение словаряintи его роль в процессе привязки (а также проверки достоверности).ModelStateСловарь ModelState
Словарь
содержит записи для всех привязываемых свойств и запись для самой модели. Если во время привязки возникает ошибка, то механизм привязки добавляет ее к записи словаря для свойства и устанавливаетModelStateвModelState.IsValid. Если всем нужным свойствам были успешно присвоены значения, тогда механизм привязки устанавливаетfalseвModelState.IsValid.trueНа заметку! Проверка достоверности модели, которая тоже устанавливает записи словаря
, происходит после привязки модели. Как неявная, так и явная привязка модели автоматически вызывает проверку достоверности для модели. Проверка достоверности рассматривается в следующем разделе.ModelStateДобавление специальных ошибок в словарь ModelState
В дополнение к свойствам и ошибкам, добавляемым механизмом привязки, в словарь
можно добавлять специальные ошибки. Ошибки могут добавляться на уровне свойств или целой модели. Чтобы добавить специфическую ошибку для свойства (например, свойстваModelStateсущностиPetName), применяйте такой код:CarModelState.AddModelError("PetName","Name is required");Чтобы добавить ошибку для целой модели, указывайте в качестве имени свойства
:string.EmptyModelState.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<IActionResult> Create(){var vm = new Car();if (await TryUpdateModelAsync(vm,"",c=>c.Color,c=>c.PetName,c=>c.MakeId, c=>c.TimeStamp)){// Делать что-то важное.


