Валидация на стороне сервера

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 08.12.2019

Валидация на стороне сервера, то есть в контроллере, осуществляется посредством помощью проверки свойства 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>
ModelState в ASP.NET Core

Кроме ошибок для конкретного свойства мы можем указывать ошибки на уровне модели. Выше мы видели, что у нас одно свойство имеет некорректное значение. Ошибки же на уровне модели связывают несколько свойств. Например,

[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>
Валидация модели в ASP.NET Core

Количество ошибок

Фреймворк 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);
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850