Como você obtém uma lista de todas as mensagens de erro do ModelState? Encontrei este código para obter todas as chaves: ( Retornando uma lista de chaves com erros do ModelState )
var errorKeys = (from item in ModelState
where item.Value.Errors.Any()
select item.Key).ToList();
Mas como eu receberia as mensagens de erro como IList ou IQueryable?
Eu poderia ir:
foreach (var key in errorKeys)
{
string msg = ModelState[error].Errors[0].ErrorMessage;
errorList.Add(msg);
}
Mas isso é feito manualmente - certamente existe uma maneira de fazer isso usando o LINQ? A propriedade .ErrorMessage está tão longe na cadeia que não sei como escrever o LINQ ...
c#
asp.net-mvc
linq
modelstate
JK.
fonte
fonte
.Where(kvp => kvp.Value.Errors.Count > 0)
Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
você deve usarvar 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());
Caso contrário, você não terá os ExceptionMessagesAqui está a implementação completa com todas as peças reunidas:
Primeiro, crie um método de extensão:
Em seguida, chame esse método de extensão e retorne os erros da ação do controlador (se houver) como json:
E, finalmente, mostre esses erros no lado do cliente (no estilo jquery.validation, mas pode ser facilmente alterado para qualquer outro estilo)
fonte
.Where(m => m.Value.Count() > 0)
também pode ser escrito como.Where(m => m.Value.Any())
.Eu gosto de usar
Hashtable
aqui, para que eu receba o objeto JSON com propriedades como chaves e erros como valor no formulário da matriz de cadeias.Dessa forma, você obtém a seguinte resposta:
fonte
Existem muitas maneiras diferentes de fazer isso que funcionam. Aqui está agora eu faço isso ...
fonte
BadRequest(ModelState)
e ele será serializado no JSON para você.A maneira mais fácil de fazer isso é simplesmente retornar a
BadRequest
com o ModelState:Por exemplo, em um
PUT
:Se usarmos anotações de dados em, por exemplo, um número de celular, como este, na
Update
classe:Isso retornará o seguinte em uma solicitação inválida:
fonte
@JK me ajudou muito, mas por que não:
fonte
Dê uma olhada no System.Web.Http.Results.OkNegotiatedContentResult.
Ele converte o que você joga nele em JSON.
Então eu fiz isso
Isso resultou em:
Ainda estou para verificar o que acontece quando há mais de um erro para cada campo, mas o ponto é que OkNegoriatedContentResult é brilhante!
Tenho a ideia linq / lambda de @SLaks
fonte
Maneira simples de conseguir isso usando a funcionalidade incorporada
Resultado JSON será
fonte
ToDictionary é uma extensão enumerável encontrada no System.Linq empacotado na dll System.Web.Extensions http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx . Aqui está a aparência da classe completa para mim.
fonte
Por que não retornar o
ModelState
objeto original ao cliente e, em seguida, use o jQuery para ler os valores. Para mim, parece muito mais simples e usa a estrutura de dados comum (.netModelState
)para retornar o
ModelState
como Json, simplesmente passe-o para o construtor de classe Json (funciona com QUALQUER objeto)C #:
js:
fonte
Variação com tipo de retorno em vez de retornar IEnumerable
fonte
Eu criei e extensão que retorna string com separador "" (você pode usar o seu próprio):
fonte
se você usar jsonresult, retorne
ou você pode simplesmente devolver o modelStateErrors, eu não tentei. O que fiz foi atribuir a coleção de erros ao meu ViewModel e depois fazer um loop. Nesse caso, posso retornar meus erros via json. Eu tenho uma classe / modelo, eu queria pegar a fonte / chave, mas ainda estou tentando descobrir.
fonte