Получение коллекции ошибок Model State в ASP.NET MVC
Быстрый ответ
Применяя следующий LINQ-запрос к ModelState
, можно получить список сообщений об ошибках состояния модели в ASP.NET MVC:
var errorList = ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage).ToList();
Таким образом, вы создадите коллекцию List<string>
, содержащую все сообщения об ошибках, которые затем будет возможно использовать для вывода на экран или для логирования.
Управление ошибками более глубокое
Проверка ModelState
ModelState
в приложении ASP.NET MVC собирает ошибки валидации, которые возникают при привязке модели. Проверка ModelState.IsValid
помогает удостовериться в том, что мы не работаем с некорректными данными:
if (!ModelState.IsValid)
{
// Ибо золото из мусора не извлечь!
}
Выявление конкретных ошибок
Используйте следующий код, чтобы отследить наличие ошибок до выполнения действия:
bool hasErrors = ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1);
Для детального анализа ошибок, связанных с определёнными свойствами, внимательно проверьте ModelState
:
foreach (var stateValue in ViewData.ModelState)
{
foreach (var error in stateValue.Value.Errors)
{
// Здесь вы найдете детали ошибок!
}
}
Формирование сообщений об ошибках
Если вам требуется создать одну строку с сообщениями об ошибках для просмотра:
var singleErrorMessage = string.Join("; ", ModelState.Values
.SelectMany(e => e.Errors)
.Select(e => e.ErrorMessage));
Использование LINQ для сортировки ошибок
Метод LINQ SelectMany
будет полезен для обработки вложенных коллекций, а ключи в ModelState.Keys
позволят вам перебрать свойства модели:
var modelStateErrors = ModelState
.Where(kvp => kvp.Value.Errors.Count > 0)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Errors
.Select(e => e.ErrorMessage)
.ToArray());
// В сложности вы не сможете спрятать ошибку
Улучшение визуализации ошибок и элементов формы
Для повышения удобства использования пользователями, выделяйте элементы управления, это содержащие ошибки:
@Html.TextBoxFor(m => m.Name, new { @class = ViewData.ModelState["Name"].Errors.Any() ? "input-validation-error" : "" })
@Html.ValidationMessageFor(m => m.Name)
// Игра начинается, найдите ошибку!
Визуализация
Ошибки состояния модели в ASP.NET MVC можно представить как сеть, которая ловит маленьких рыбок-ошибок в огромном океане данных:
🌊 Океан данных
🌐🐠🐟🐡 Сеть ошибок модели
Используйте увеличительное стекло, чтобы рассмотреть улов:
🔍 | Ошибки
---|----------------
1 | 🐟 Поле 'Name' необходимо заполнить.
2 | 🐠 Поле 'Email' не соответствует формату электронного адреса.
3 | 🐡 Поле 'Age' должно иметь положительное значение.
Каждая "ячейка" сети символизирует место, где ошибка была поймана, и теперь ожидает обработки.
Плавание по морю ошибок
Как только ошибки пойманы:
- Пройдите с пользователями через
ModelState
, выделяя ошибки прямо около полей форм. - Сделайте ошибки более заметными посредством условного стиля CSS.
- Обеспечьте своевременную обратную связь, используя аннотации данных в моделях.
Доступность обработки ошибок
Организуйте обработку ошибок доступной для всех пользователей:
- Используйте атрибут
aria-invalid="true"
в полях с ошибками для улучшения доступности. - Применяйте
aria-live
зоны для оперативной обратной связи с пользователями средств чтения с экрана.
Лучшие практики работы с ошибками ModelState
Учтите следующие лучшие практики:
- Ведите журнал ошибок ModelState для аудита и отладки.
- В сообщениях об ошибках избегайте специализированных терминов, предпочитайте ясность и конкретику.
- Представляйте ошибки так, чтобы избежать их перегрузки информацией, используйте всплывающие подсказки или встроенные сообщения для облегчения чтения.
Полезные материалы
- Добавление валидации | Microsoft Learn — официальное руководство по внедрению валидации в приложения ASP.NET MVC.
- ModelState в ASP.NET MVC — детальное исследование того, как управлять ModelState и ошибками.
- Решение проблем с неоднозначными методами действий в ASP.NET MVC и Ajax — полезное руководство по работе с ошибками ModelState и Ajax.
- Postbacks в ASP.NET MVC и ModelState — важность диагностики и журналирования ошибок ModelState.