Wie erhalten Sie eine Liste aller ModelState-Fehlermeldungen? Ich habe diesen Code gefunden, um alle Schlüssel zu erhalten: ( Rückgabe einer Liste von Schlüsseln mit ModelState-Fehlern )
var errorKeys = (from item in ModelState
where item.Value.Errors.Any()
select item.Key).ToList();
Aber wie würde ich die Fehlermeldungen als IList oder IQueryable erhalten?
Ich könnte gehen:
foreach (var key in errorKeys)
{
string msg = ModelState[error].Errors[0].ErrorMessage;
errorList.Add(msg);
}
Aber das geht manuell - gibt es doch eine Möglichkeit, es mit LINQ zu machen? Die .ErrorMessage-Eigenschaft befindet sich so weit unten in der Kette, dass ich nicht weiß, wie ich den LINQ schreiben soll ...
.Where(kvp => kvp.Value.Errors.Count > 0)
Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
Ihnen zu erhalten, sollten Sie verwenden.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());
Andernfalls haben Sie nicht die ExceptionMessagesHier ist die vollständige Implementierung mit allen Teilen zusammen:
Erstellen Sie zunächst eine Erweiterungsmethode:
Rufen Sie dann diese Erweiterungsmethode auf und geben Sie die Fehler aus der Controller-Aktion (falls vorhanden) als json zurück:
Zeigen Sie diese Fehler schließlich auf der Clientseite an (im Stil jquery.validation, kann aber problemlos in einen anderen Stil geändert werden).
quelle
.Where(m => m.Value.Count() > 0)
könnte auch geschrieben werden als.Where(m => m.Value.Any())
.Ich verwende
Hashtable
hier gerne , damit ich ein JSON-Objekt mit Eigenschaften als Schlüssel und Fehlern als Wert in Form eines String-Arrays erhalte.Auf diese Weise erhalten Sie folgende Antwort:
quelle
Es gibt viele verschiedene Möglichkeiten, dies zu tun, die alle funktionieren. Hier ist jetzt mache ich es ...
quelle
BadRequest(ModelState)
und es wird für Sie in JSON serialisiert.Der einfachste Weg, dies zu tun, besteht darin, a
BadRequest
mit dem ModelState selbst zurückzugeben:Zum Beispiel auf einem
PUT
:Wenn wir Datenanmerkungen beispielsweise auf einer Handynummer wie dieser in der
Update
Klasse verwenden:Dies gibt bei einer ungültigen Anforderung Folgendes zurück:
quelle
@JK es hat mir sehr geholfen aber warum nicht:
quelle
Schauen Sie sich System.Web.Http.Results.OkNegotiatedContentResult an.
Es konvertiert alles, was Sie hineinwerfen, in JSON.
Also habe ich das gemacht
Dies führte zu:
Ich muss noch überprüfen, was passiert, wenn es mehr als einen Fehler für jedes Feld gibt, aber der Punkt ist, dass OkNegoriatedContentResult brillant ist!
Habe die Linq / Lambda-Idee von @SLaks
quelle
Dies erreichen Sie auf einfache Weise mithilfe der integrierten Funktionalität
JSON-Ergebnis wird sein
quelle
ToDictionary ist eine Enumerable-Erweiterung in System.Linq, die in der System.Web.Extensions-DLL http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx enthalten ist . So sieht die komplette Klasse für mich aus.
quelle
Warum nicht das ursprüngliche
ModelState
Objekt an den Client zurückgeben und dann mit jQuery die Werte lesen? Für mich sieht es viel einfacher aus und verwendet die gemeinsame Datenstruktur (.net'sModelState
)die
ModelState
Um als Json zurückzugeben, übergeben Sie es einfach an den Json-Klassenkonstruktor (funktioniert mit JEDEM Objekt)C #:
js:
quelle
Variation mit Rückgabetyp anstelle von IEnumerable
quelle
Ich habe eine Erweiterung erstellt, die einen String mit Trennzeichen "" zurückgibt (Sie können Ihren eigenen verwenden):
quelle
Wenn Sie jsonresult verwenden, kehren Sie zurück
oder Sie können einfach die modelStateErrors zurückgeben, ich habe es nicht versucht. Ich habe die Errors-Auflistung meinem ViewModel zugewiesen und sie dann wiederholt. In diesem Fall kann ich meine Errors über json zurückgeben. Ich habe eine Klasse / ein Modell, ich wollte die Quelle / den Schlüssel haben, aber ich versuche immer noch, es herauszufinden.
quelle