Jak uzyskać listę wszystkich komunikatów o błędach ModelState? Znalazłem ten kod, aby uzyskać wszystkie klucze: ( Zwracanie listy kluczy z błędami ModelState )
var errorKeys = (from item in ModelState
where item.Value.Errors.Any()
select item.Key).ToList();
Ale jak uzyskać komunikaty o błędach jako IList lub IQueryable?
Mógłbym pójść:
foreach (var key in errorKeys)
{
string msg = ModelState[error].Errors[0].ErrorMessage;
errorList.Add(msg);
}
Ale to robi to ręcznie - na pewno jest sposób, aby to zrobić za pomocą LINQ? Właściwość .ErrorMessage jest tak daleko w łańcuchu, że nie wiem, jak napisać LINQ ...
.Where(kvp => kvp.Value.Errors.Count > 0)
Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
, należy użyć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());
W przeciwnym razie nie będziesz mieć wiadomości wyjątkowychOto pełna realizacja ze wszystkimi połączonymi elementami:
Najpierw utwórz metodę rozszerzenia:
Następnie wywołaj tę metodę rozszerzenia i zwróć błędy z akcji kontrolera (jeśli istnieją) jako json:
Na koniec pokaż te błędy po stronie klienta (w stylu jquery.validation, ale można je łatwo zmienić na dowolny inny styl)
źródło
.Where(m => m.Value.Count() > 0)
można również zapisać jako.Where(m => m.Value.Any())
.Lubię
Hashtable
tutaj używać , aby uzyskać obiekt JSON z właściwościami jako kluczami i błędami jako wartością w postaci tablicy ciągów.W ten sposób otrzymasz następującą odpowiedź:
źródło
Można to zrobić na wiele różnych sposobów, z których wszystkie działają. Oto teraz robię to ...
źródło
BadRequest(ModelState)
a zostanie on serializowany do formatu JSON za Ciebie.Najłatwiejszym sposobem jest po prostu zwrócenie a
BadRequest
z samym ModelState:Na przykład na
PUT
:Jeśli używamy adnotacji danych np. Na numerze telefonu komórkowego, jak ten, na
Update
zajęciach:W przypadku nieprawidłowego żądania zwróci to następujące informacje:
źródło
@JK bardzo mi to pomogło, ale czemu nie:
źródło
Spójrz na System.Web.Http.Results.OkNegotiatedContentResult.
Konwertuje wszystko, co do niego wrzucisz, na JSON.
Więc zrobiłem to
Spowodowało to:
Jeszcze nie sprawdziłem, co się dzieje, gdy w każdym polu występuje więcej niż jeden błąd, ale chodzi o to, że OkNegoriatedContentResult jest genialny!
Pomysł na linq / lambda z @SLaks
źródło
Prosty sposób na osiągnięcie tego dzięki wbudowanej funkcjonalności
Wynik JSON będzie
źródło
ToDictionary to Enumerable rozszerzenie znalezione w System.Linq spakowane w bibliotece dll System.Web.Extensions http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx . Oto jak wygląda dla mnie cała klasa.
źródło
Dlaczego nie zwrócić oryginalnego
ModelState
obiektu klientowi, a następnie użyć jQuery do odczytania wartości. Wydaje mi się, że wygląda to na znacznie prostsze i wykorzystuje wspólną strukturę danych (.netModelState
)aby zwrócić
ModelState
jako Json, po prostu przekaż go do konstruktora klasy Json (działa z DOWOLNYM obiektem)DO#:
js:
źródło
Odmiana z typem zwracanym zamiast zwracania IEnumerable
źródło
Zrobiłem rozszerzenie, które zwraca ciąg z separatorem „” (możesz użyć własnego):
źródło
jeśli używasz jsonresult, to return
lub możesz po prostu zwrócić modelStateErrors, nie próbowałem tego. To, co zrobiłem, to przypisanie kolekcji Errors do mojego ViewModel, a następnie zapętlenie jej. W takim przypadku mogę zwrócić moje błędy za pośrednictwem json. Mam klasę / model, chciałem uzyskać źródło / klucz, ale wciąż próbuję to rozgryźć.
źródło