Как получить список всех сообщений об ошибках ModelState? Я нашел этот код, чтобы получить все ключи: ( Возвращение списка ключей с ошибками ModelState )
var errorKeys = (from item in ModelState
where item.Value.Errors.Any()
select item.Key).ToList();
Но как мне получить сообщения об ошибках в виде IList или IQueryable?
Я мог бы пойти:
foreach (var key in errorKeys)
{
string msg = ModelState[error].Errors[0].ErrorMessage;
errorList.Add(msg);
}
Но что делать это вручную - наверняка есть способ сделать это с помощью LINQ? Свойство .ErrorMessage находится так далеко вниз по цепочке, что я не знаю, как написать LINQ ...
Вы можете поместить все, что хотите, что хотите, в предложение select
:
var errorList = (from item in ModelState
where item.Value.Errors.Any()
select item.Value.Errors[0].ErrorMessage).ToList();
EDIT: Вы можете извлечь несколько ошибок в отдельные элементы списка, добавив предложение from
, например:
var errorList = (from item in ModelState.Values
from error in item.Errors
select error.ErrorMessage).ToList();
Or:
var errorList = ModelState.Values.SelectMany(m => m.Errors)
.Select(e => e.ErrorMessage)
.ToList();
2nd EDIT:
Вы ищете Словарь<струнная, строка[]>
:
var errorList = ModelState.ToDictionary(
kvp => kvp.Key,
kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToArray()
);
Вот полная реализация со всеми соединенными частями:
Сначала создайте метод расширения:
public static class ModelStateHelper
{
public static IEnumerable Errors(this ModelStateDictionary modelState)
{
if (!modelState.IsValid)
{
return modelState.ToDictionary(kvp => kvp.Key,
kvp => kvp.Value.Errors
.Select(e => e.ErrorMessage).ToArray())
.Where(m => m.Value.Any());
}
return null;
}
}
Затем вызовите этот метод расширения и верните ошибки из действия контроллера (если есть) как json:
if (!ModelState.IsValid)
{
return Json(new { Errors = ModelState.Errors() }, JsonRequestBehavior.AllowGet);
}
И, наконец, покажите эти ошибки на стороне клиента (в стиле jquery.validation, но его можно легко изменить на любой другой стиль)
function DisplayErrors(errors) {
for (var i = 0; i < errors.length; i++) {
$("<label for='" + errors[i].Key + "' class='error'></label>")
.html(errors[i].Value[0]).appendTo($("input#" + errors[i].Key).parent());
}
}