Chcę uzyskać wszystkie komunikaty o błędach ze modelu modelState bez znajomości kluczowych wartości. Pętla przechwytuje wszystkie komunikaty o błędach, które zawiera ModelState.
W jaki sposób mogę to zrobić?
asp.net-mvc
modelstate
chobo2
źródło
źródło
@Html.ValidationSummary()
szybko wyświetlić je wszystkie.foreach (var error in ViewData.ModelState.Values.SelectMany(modelState => modelState.Errors)) { DoSomething(error); }
Odpowiedzi:
Zobacz także Jak uzyskać kolekcję błędów stanu modelu w ASP.NET MVC? .
źródło
Value.ErrorMessage
zamiastValue.Exception.Message
foreach (KeyValuePair<string, ModelState> kvp in htmlHelper.ViewData.ModelState) {
i wstawić ten wiersz pod nim:var modelState = kvp.Value;
. Klucz możesz zdobyć odkvp.Key
Za pomocą LINQ :
źródło
List<string> errors = new List<string>()
zamiastvar errors = new List<string>()
jest naprawdę stratą czasu, ale pisanieIEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);
, w którym typ zwracany nie jest tak naprawdę klarowny, jest naprawdę większe pod względem czytelności. (nawet jeśli studio wizualne może dać ci to po najechaniu myszą)Opierając się na wersji LINQ, jeśli chcesz połączyć wszystkie komunikaty o błędach w jeden ciąg:
źródło
Byłem w stanie to zrobić za pomocą małego LINQ,
Powyższa metoda zwraca listę błędów sprawdzania poprawności.
Dalsza lektura:
Jak odczytać wszystkie błędy z ModelState w ASP.NET MVC
źródło
Podczas debugowania przydatne jest umieszczenie tabeli na dole każdej strony, aby wyświetlić wszystkie błędy ModelState.
źródło
Jak odkryłem, postępując zgodnie z radą zawartą w odpowiedziach udzielonych do tej pory, możesz uzyskać wyjątki występujące bez ustawiania komunikatów o błędach, więc aby złapać wszystkie problemy, naprawdę potrzebujesz zarówno komunikatu o błędzie, jak i wyjątku.
lub jako metoda rozszerzenia
źródło
W przypadku, gdy ktoś chce zwrócić właściwość Nazwa modelu za powiązanie komunikatu o błędzie w silnie typowanym widoku.
W ten sposób możesz powiązać błąd z polem, które go zgłosiło.
źródło
Samo wysyłanie samych komunikatów o błędach nie było dla mnie wystarczające, ale to załatwiło sprawę.
źródło
Na wypadek, gdyby ktoś tego potrzebował, stworzyłem i stosuję następującą klasę statyczną w moich projektach
Przykład użycia:
Zastosowania:
Klasa:
źródło
I to też działa:
źródło
SelectMany
jest dostępny.Przydatne do przekazywania tablicy komunikatów o błędach do View, być może przez Json:
źródło
To rozwija się w odpowiedzi na odpowiedź @Dunc. Zobacz komentarze do dokumentu xml
źródło
Ponadto
ModelState.Values.ErrorMessage
może być pusty, aleModelState.Values.Exception.Message
może wskazywać na błąd.źródło
W twojej implementacji brakuje klasy statycznej, tak powinno być.
raczej
źródło
po prostu użyj Tag Helper Tag-podsumowanie-podsumowanie
źródło