545 Stimmen

Wie man alle Fehler von ASP.Net MVC modelState erhalten?

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?

16voto

Alan Macdonald Punkte 1824

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();

}

12voto

james31rock Punkte 2525

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.

10voto

r_piramoon Punkte 41

Dieses Codeschnipsel ist ebenfalls nützlich und gibt Ihnen eine Liste, die Fehlermeldungen enthält.

var errors = ModelState.Values.SelectMany(x => x.Errors.Select(c => c.ErrorMessage)).ToList();

7voto

Josh Sutterfield Punkte 1872

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));

7voto

Jivan Bhandari Punkte 740

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.com

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.

Powered by:

X