Ich möchte alle Fehlermeldungen aus dem modelState erhalten, ohne die Schlüsselwerte zu kennen. Schleife durch, um alle Fehlermeldungen zu erfassen, die der ModelState enthält.
Wie kann ich das tun?
Ich möchte alle Fehlermeldungen aus dem modelState erhalten, ohne die Schlüsselwerte zu kennen. Schleife durch, um alle Fehlermeldungen zu erfassen, die der ModelState enthält.
Wie kann ich das tun?
Wie ich herausgefunden habe, nachdem ich die Ratschläge in den bisherigen Antworten befolgt habe, können Ausnahmen auftreten, ohne dass Fehlermeldungen gesetzt werden, so dass Sie wirklich alle Probleme abfangen müssen, um sowohl die ErrorMessage als auch die Exception zu erhalten.
String messages = String.Join(Environment.NewLine, ModelState.Values.SelectMany(v => v.Errors)
.Select( v => v.ErrorMessage + " " + v.Exception));
oder als Erweiterungsmethode
public static IEnumerable<String> GetErrors(this ModelStateDictionary modelState)
{
return modelState.Values.SelectMany(v => v.Errors)
.Select( v => v.ErrorMessage + " " + v.Exception).ToList();
}
Für den Fall, dass jemand den Namen der Model-Eigenschaft zum Binden der Fehlermeldung in einer stark typisierten Ansicht zurückgeben möchte.
List<ErrorResult> Errors = new List<ErrorResult>();
foreach (KeyValuePair<string, ModelState> modelStateDD in ViewData.ModelState)
{
string key = modelStateDD.Key;
ModelState modelState = modelStateDD.Value;
foreach (ModelError error in modelState.Errors)
{
ErrorResult er = new ErrorResult();
er.ErrorMessage = error.ErrorMessage;
er.Field = key;
Errors.Add(er);
}
}
Auf diese Weise können Sie den Fehler tatsächlich mit dem Feld verknüpfen, das den Fehler ausgelöst hat.
Nur die Fehlermeldungen selbst auszugeben, war für mich nicht ausreichend, aber das hier hat den Zweck erfüllt.
var modelQuery = (from kvp in ModelState
let field = kvp.Key
let state = kvp.Value
where state.Errors.Count > 0
let val = state.Value?.AttemptedValue ?? "[NULL]"
let errors = string.Join(";", state.Errors.Select(err => err.ErrorMessage))
select string.Format("{0}:[{1}] (ERRORS: {2})", field, val, errors));
Trace.WriteLine(string.Join(Environment.NewLine, modelQuery));
Jeder, der nach asp.net core 3.1 sucht. Geringfügig aktualisiert als die obige Antwort. Ich fand, dass dies ist, was [ApiController] zurückgibt
Dictionary<string, List<string>> errors = new Dictionary<string, List<string>>();
foreach (KeyValuePair<string, ModelStateEntry> kvp in ViewData.ModelState)
{
string key = kvp.Key;
ModelStateEntry entry = kvp.Value;
if (entry.Errors.Count > 0)
{
List<string> errorList = new List<string>();
foreach (ModelError error in entry.Errors)
{
errorList.Add(error.ErrorMessage);
}
errors[key] = errorList;
}
}
return new JsonResult(new {Errors = errors});
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.