Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Кроме валидации на стороне клиента, мы можем осуществлять валидацию и внутри контроллера. Делается это с помощью проверки значения свойства ModelState.IsValid.
Объект ModelState сохраняет все значения, которые пользователь ввел для свойств модели, а также все ошибки, связанные с каждым свойством и с моделью в целом. Если в объекте ModelState имеются какие-нибудь ошибки, то свойство ModelState.IsValid возвратит false:
[HttpPost] public ActionResult Create(Book book) { if (ModelState.IsValid) { ViewBag.Message = "Valid"; db.Books.Add(book); db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.Message = "Non Valid"; return View(book); }
Допустим, значение для свойства Name у нас не указано, и мы отсылаем значения модели на сервер. Поскольку к свойству применяется атрибут Required, то после привязки модели при валидации мы получим следующие значения:
ModelState.IsValid == false ModelState.IsValidField("Name") == false ModelState["Name"].Errors.Count > 0
Мы также можем проверять корректность значений отдельных свойств модели:
[HttpPost] public ActionResult Create(Book book) { if (string.IsNullOrEmpty(book.Name)) { ModelState.AddModelError("Name", "Некорректное название книги"); } else if (book.Name.Length > 5) { ModelState.AddModelError("Name", "Недопустимая длина строки"); } if (ModelState.IsValid) { ViewBag.Message = "Валидация пройдена"; db.Books.Add(book); db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.Message = "Запрос не прошел валидацию"; return View(book); }
В данном случае метод ModelState.AddModelError
добавляет для свойства, указанного в качестве первого параметра (в данном случае
Name
) ошибку "Недопустимая длина строки". При использовании хелперов впоследствии мы можем вывести данное сообщение об ошибке:
<div class="editor-label"> @Html.LabelFor(model => model.Name) </div> <div class="editor-field"> @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) </div>
Кроме ошибок для конкретного свойства мы можем указывать ошибки на уровне модели. Выше мы видели, что у нас одно свойство имеет некорректное значение. Ошибки же на уровне модели связывают несколько свойств. Например,
if (book.Author=="Л. Толстой" && book.Year > 1910) { ModelState.AddModelError("","Год не должен быть равен 1984"); }
Оба свойства могут быть корректными в других ситуациях, но не вместе. Понятно, что Лев Толстой не мог написать, скажем, книги после своей смерти. Поэтому мы добавляем ошибку на уровне модели и в качестве первого параметра опускаем название свойства и указываем просто кавычки.