Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Валидация на стороне сервера, то есть в контроллере, осуществляется посредством помощью проверки свойства ModelState.IsValid.
Объект ModelState сохраняет все значения, которые пользователь ввел для свойств модели, а также все ошибки, связанные с каждым свойством и с моделью в целом. Если в объекте ModelState имеются какие-нибудь ошибки, то свойство ModelState.IsValid возвратит false:
[HttpPost] public IActionResult Create(Person person) { if (ModelState.IsValid) return Content($"{person.Name} - {person.Email}"); return View(person); }
Допустим, при отправке модели Person в контроллер для свойства Name значение не указано. Поскольку к свойству применяется атрибут Required, то после привязки модели при валидации мы получим следующие значения:
ModelState.IsValid = false ModelState["Name"].Errors.Count = 1 ModelState["Name"].ValidationState = Microsoft.AspNetCore.Mvc.ModelBinding.ModelValidationState.Invalid
Мы также можем проверять корректность значений отдельных свойств модели:
[HttpPost] public IActionResult Create(Person person) { if (string.IsNullOrEmpty(person.Name)) { ModelState.AddModelError("Name", "Некорректное имя"); } else if (person.Name.Length > 5) { ModelState.AddModelError("Name", "Недопустимая длина строки"); } if (ModelState.IsValid) { return Content($"{person.Name} - {person.Email}"); } return View(person); }
В данном случае метод ModelState.AddModelError
добавляет для свойства, указанного в качестве первого параметра (в данном случае Name
)
ошибку "Недопустимая длина строки". При использовании хелперов впоследствии мы можем вывести данное сообщение об ошибке:
<div> <label asp-for="Name"></label><br /> <input type="text" asp-for="Name" /> <span asp-validation-for="Name"></span> </div>
Кроме ошибок для конкретного свойства мы можем указывать ошибки на уровне модели. Выше мы видели, что у нас одно свойство имеет некорректное значение. Ошибки же на уровне модели связывают несколько свойств. Например,
[HttpPost] public IActionResult Create(Person person) { if (person.Name == person.Password) { ModelState.AddModelError("", "Имя и пароль не должны совпадать"); } if (ModelState.IsValid) return Content($"{person.Name} - {person.Email}"); return View(person); }
В данном случае мы не хотим, чтобы имя и пароль совпадали. И при их совпадении устанавливаем ошибку для всей модели. Подобные ошибки часто выводятся в верху формы ввода. И для подобных ошибок мы можем использовать следующий хелпер:
<div class="validation" asp-validation-summary="ModelOnly"></div>
Фреймворк MVC валидирует свойства объекта, пока количество ошибок не достигнет предельного максимального количества (по умолчанию это 200 ошибок).
Но мы можем настроить это поведение, определив нужное количество ошибок в методе ConfigureServices()
класса Startup:
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(options=> options.MaxModelValidationErrors = 50); // или так //services.AddMvc(options => options.MaxModelValidationErrors = 50); services.AddMvc(options => options.MaxModelValidationErrors = 50); }