ASP.NET MVC Как конвертировать ошибки ModelState в json

Как получить список всех сообщений об ошибках 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 ...

123
задан Community 23 May 2017 в 11:47
поделиться

2 ответа

Вы можете поместить все, что хотите, что хотите, в предложение 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()
);
184
ответ дан 24 November 2019 в 01:12
поделиться

Вот полная реализация со всеми соединенными частями:

Сначала создайте метод расширения:

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());
    }
}
73
ответ дан 24 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: