it-swarm.com.de

Fehlermeldung erhalten, wenn ModelState.IsValid fehlschlägt?

Ich habe diese Funktion in meinem Controller.

[HttpPost]
public ActionResult Edit(EmployeesViewModel viewModel)
{
    Employee employee = GetEmployee(viewModel.EmployeeId);
    TryUpdateModel(employee);

    if (ModelState.IsValid)
    {
        SaveEmployee(employee);
        TempData["message"] = "Employee has been saved.";
        return RedirectToAction("Details", new { id = employee.EmployeeID });
    }

    return View(viewModel); // validation error, so redisplay same view
}

Es versagt immer wieder, ModelState.IsValid gibt immer false zurück und zeigt die Ansicht erneut an. Aber ich habe keine Ahnung, was der Fehler ist.

Gibt es eine Möglichkeit, den Fehler abzurufen und dem Benutzer erneut anzuzeigen?

56
Steven

Sie können dies in Ihrer Ansicht tun, ohne spezielle Aktionen auszuführen, indem Sie Html.ValidationSummary () verwenden, um alle Fehlernachrichten anzuzeigen, oder Html.ValidationMessageFor () , um eine Nachricht für eine bestimmte Eigenschaft von anzuzeigen das Model.

Wenn Sie die Fehler weiterhin in Ihrer Aktion oder Ihrem Controller sehen müssen, lesen Sie die Eigenschaft ModelState.Errors

32
Daniel Schaffer

Versuche dies

if (ModelState.IsValid)
{
    //go on as normal
}
else
{
    var errors = ModelState.Select(x => x.Value.Errors)
                           .Where(y=>y.Count>0)
                           .ToList();
}

errors wird eine Liste aller Fehler sein.

Wenn Sie dem Benutzer die Fehler anzeigen möchten, müssen Sie das Modell nur in die Ansicht zurückbringen. Wenn Sie die Razor @Html.ValidationFor()-Ausdrücke nicht entfernt haben, wird sie angezeigt.

if (ModelState.IsValid)
{
    //go on as normal
}
else
{
    return View(model);
}

In der Ansicht werden Validierungsfehler neben jedem Feld und/oder in der Validation-Zusammenfassung angezeigt, sofern diese vorhanden ist.

113

Wenn Sie eine einzelne Fehlernachrichtenzeichenfolge generieren möchten, die die ModelState-Fehlernachrichten enthält, können Sie SelectMany verwenden, um die Fehler in einer einzigen Liste zusammenzufassen:

if (!ModelState.IsValid)
{
    var message = string.Join(" | ", ModelState.Values
        .SelectMany(v => v.Errors)
        .Select(e => e.ErrorMessage));
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
}
64
JohnnyHK

Wenn der modale Status nicht gültig ist und der Fehler nicht auf dem Bildschirm angezeigt wird, da sich das Steuerelement in einem minimierten Akkordeon befindet, können Sie den HttpStatusCode zurückgeben, sodass die tatsächliche Fehlermeldung angezeigt wird, wenn Sie F12 ausführen. Sie können diesen Fehler auch im ELMAH-Fehlerprotokoll protokollieren. Unten ist der Code

if (!ModelState.IsValid)
{
              var message = string.Join(" | ", ModelState.Values
                                            .SelectMany(v => v.Errors)
                                            .Select(e => e.ErrorMessage));

                //Log This exception to ELMAH:
                Exception exception = new Exception(message.ToString());
                Elmah.ErrorSignal.FromCurrentContext().Raise(exception);

                //Return Status Code:
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
}

Beachten Sie jedoch, dass dieser Code alle Validierungsfehler protokolliert. Dies sollte daher nur verwendet werden, wenn eine solche Situation auftritt, in der Sie die Fehler nicht auf dem Bildschirm sehen können.

5
Sachin T Sawant

Wenn jemand für Web-API hier ist (nicht MVC), geben Sie einfach das Objekt ModelState zurück:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);

1
codeMonkey

Versuchen

ModelState.Values.First().Errors[0].ErrorMessage
0
Delmirio Segura

Es ist eine Beispielerweiterung

public class GetModelErrors
{
    //Usage return Json to View :
    //return Json(new { state = false, message = new GetModelErrors(ModelState).MessagesWithKeys() });
    public class KeyMessages
    {
        public string Key { get; set; }
        public string Message { get; set; }
    }
    private readonly ModelStateDictionary _entry;
    public GetModelErrors(ModelStateDictionary entry)
    {
        _entry = entry;
    }

    public int Count()
    {
        return _entry.ErrorCount;
    }
    public string Exceptions(string sp = "\n")
    {
        return string.Join(sp, _entry.Values
            .SelectMany(v => v.Errors)
            .Select(e => e.Exception));
    }
    public string Messages(string sp = "\n")
    {
        string msg = string.Empty;
        foreach (var item in _entry)
        {
            if (item.Value.ValidationState == ModelValidationState.Invalid)
            {
                msg += string.Join(sp, string.Join(",", item.Value.Errors.Select(i => i.ErrorMessage)));
            }
        }
        return msg;
    }

    public List<KeyMessages> MessagesWithKeys(string sp = "<p> ● ")
    {
        List<KeyMessages> list = new List<KeyMessages>();
        foreach (var item in _entry)
        {
            if (item.Value.ValidationState == ModelValidationState.Invalid)
            {
                list.Add(new KeyMessages
                {
                    Key = item.Key,
                    Message = string.Join(null, item.Value.Errors.Select(i => sp + i.ErrorMessage))
                });
            }
        }
        return list;
    }
}
0
OMANSAK

Ich habe keine Ahnung, ob dies Ihr Problem ist, aber wenn Sie einen Benutzer hinzufügen und dann den Namen Ihrer Anwendung ändern, bleibt dieser Benutzer (natürlich) in der Datenbank, ist aber ungültig (was korrektes Verhalten ist). Für diesen Fehlertyp wird jedoch kein Fehler hinzugefügt. Die Fehlerliste ist leer, aber ModelState.IsValid gibt für die Anmeldung false zurück.

0
user1056921

Ok Überprüfen und hinzufügen:

  1. Führen Sie einen Haltepunkt in Ihrer ModelState-Zeile in Ihrem Code aus
  2. Fügen Sie Ihrer Uhr Ihren Modellstatus hinzu 
  3. Erweitern Sie ModelState "Werte".
  4. Werte erweitern "Ergebnisansicht"

Jetzt sehen Sie eine Liste aller SubKey mit dem Gültigkeitsstatus am Ende des Werts.

Suchen Sie also nach dem Ungültiger Wert .

0
Mostafa Basha
ModelState.Values.SelectMany(v => v.Errors).ToList().ForEach(x => _logger.Error($"{x.ErrorMessage}\n"));
0
user781861