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

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

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

Кроме валидации на стороне клиента, мы можем осуществлять валидацию и внутри контроллера. Делается это с помощью проверки значения свойства 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");
}

Оба свойства могут быть корректными в других ситуациях, но не вместе. Понятно, что Лев Толстой не мог написать, скажем, книги после своей смерти. Поэтому мы добавляем ошибку на уровне модели и в качестве первого параметра опускаем название свойства и указываем просто кавычки.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850