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
аналогично неявной привязке. При использовании явной привязки моделей привязываемый тип не является параметром метода действия. Скажем, вы могли бы переписать предыдущий метод
в 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
(как показано в примере ниже) ограничивает свойства, участвующие в привязке, и инструктирует средство привязки моделей о том, что остальные свойства должны игнорироваться.
можно также использовать для указания префикса имен свойств. Если имена в парах "имя-значение" имеют префикс, добавленный при их отправке методу действия, тогда атрибут
Bind
применяется для информирования средства привязки моделей о том, как сопоставлять эти имена со свойствами типа. Код в следующем примере устанавливает префикс для имен и позволяет привязывать все свойства:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(
[Bind(Prefix="MakeList")]Car car)
{
if (ModelState.IsValid)
{
// Сохранить данные.
}
}
Управление источниками привязки моделей в ASP.NET Core
Источниками привязки можно управлять через набор атрибутов на параметрах действий. Допускается также создавать специальные средства привязки моделей, но эта тема выходит за рамки настоящей книги. В табл. 29.4 перечислены атрибуты, которые можно использовать для управления привязкой моделей.
Проверка достоверности моделей
Проверка достоверности происходит немедленно после привязки модели (явной и неявной). В то время как привязка модели добавляет ошибки в словарь
ModelState
из-за возникновения проблем преобразования, проверка достоверности добавляет ошибки в
ModelState
на основе бизнес-правил. Примерами бизнес-правил могут быть обязательные поля, строки с максимально разрешенной длиной или даты с заданным допустимым диапазоном.