Как получить список всех сообщений об ошибках 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 ...
.Where(kvp => kvp.Value.Errors.Count > 0)
Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
вас, следует использоватьvar errorList = modelState.Where(elem => elem.Value.Errors.Any()) .ToDictionary( kvp => kvp.Key, kvp => kvp.Value.Errors.Select(e => string.IsNullOrEmpty(e.ErrorMessage) ? e.Exception.Message : e.ErrorMessage).ToArray());
В противном случае у вас не будет ExceptionMessagesВот полная реализация со всеми частями вместе:
Сначала создайте метод расширения:
Затем вызовите этот метод расширения и верните ошибки из действия контроллера (если есть) как json:
И, наконец, покажите эти ошибки на стороне клиента (в стиле jquery.validation, но его можно легко изменить на любой другой стиль)
источник
.Where(m => m.Value.Count() > 0)
можно также написать как.Where(m => m.Value.Any())
.Мне нравится использовать
Hashtable
здесь, так что я получаю объект JSON со свойствами в качестве ключей и ошибками в качестве значения в форме массива строк.Таким образом вы получите следующий ответ:
источник
Есть много разных способов сделать это, и все они работают. Вот теперь я это делаю ...
источник
BadRequest(ModelState)
и он сериализует его в JSON для вас.Самый простой способ сделать это - просто вернуть
BadRequest
с самим ModelState:Например, на
PUT
:Если мы используем аннотации данных, например, на номер мобильного телефона, например, в
Update
классе:Это вернет следующее при неверном запросе:
источник
@JK мне это очень помогло, но почему бы и нет:
источник
Взгляните на System.Web.Http.Results.OkNegotiatedContentResult.
Он преобразует все, что вы в него бросаете, в JSON.
Так я сделал это
Это привело к:
Мне еще предстоит проверить, что происходит, когда для каждого поля появляется более одной ошибки, но дело в том, что OkNegoriatedContentResult великолепен!
Получил идею linq / lambda от @SLaks
источник
Простой способ добиться этого, используя встроенную функциональность
Результат JSON будет
источник
ToDictionary - это расширение Enumerable, находящееся в System.Linq, упакованное в dll System.Web.Extensions http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx . Вот как для меня выглядит полный класс.
источник
Почему бы не вернуть исходный
ModelState
объект клиенту, а затем использовать jQuery для чтения значений. Для меня это выглядит намного проще и использует общую структуру данных (.netModelState
)вернуть
ModelState
как Json, просто передайте его конструктору класса Json (работает с ЛЮБЫМ объектом)C #:
ЯШ:
источник
Вариант с возвращаемым типом вместо возврата IEnumerable
источник
Я сделал и расширение, которое возвращает строку с разделителем "" (можно использовать свое):
источник
если вы используете jsonresult, верните
или вы можете просто вернуть modelStateErrors, я не пробовал. Я назначил коллекцию Errors моей модели ViewModel, а затем зациклил ее. В этом случае я могу вернуть свои ошибки через json. У меня есть класс / модель, я хотел получить источник / ключ, но все еще пытаюсь в этом разобраться.
источник