93 votes

Obtenir un message d'erreur si ModelState.IsValid échoue ?

J'ai cette fonction dans mon contrôleur.

 [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
}

Cela continue d'échouer, ModelState.IsValid continue de renvoyer false et de réafficher la vue. Mais je n'ai aucune idée de l'erreur.

Existe-t-il un moyen d'obtenir l'erreur et de la réafficher à l'utilisateur ?

161voto

Juann Strauss Points 1677

Essaye ça

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

erreurs sera une liste de toutes les erreurs.

Si vous souhaitez afficher les erreurs à l'utilisateur, il vous suffit de renvoyer le modèle dans la vue et si vous n'avez pas supprimé les @Html.ValidationFor() , il apparaîtra.

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

La vue affichera toutes les erreurs de validation à côté de chaque champ et/ou dans le ValidationSummary s'il est présent.

96voto

JohnnyHK Points 61191

Si vous cherchez à générer une chaîne de message d'erreur unique contenant les ModelState , vous pouvez utiliser SelectMany pour aplatir les erreurs en une seule liste :

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

7voto

Sachin T Sawant Points 591

Si l'état modal n'est pas valide et que l'erreur ne peut pas être vue à l'écran car votre contrôle est en accordéon réduit, vous pouvez alors renvoyer le HttpStatusCode afin que le message d'erreur réel s'affiche si vous faites F12. Vous pouvez également enregistrer cette erreur dans le journal des erreurs ELMAH. Ci-dessous le 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);
}

Mais veuillez noter que ce code enregistrera toutes les erreurs de validation. Cela ne devrait donc être utilisé que lorsqu'une telle situation se présente où vous ne pouvez pas voir les erreurs à l'écran.

5voto

codeMonkey Points 1204

Si quelqu'un est ici pour WebApi (pas MVC), vous renvoyez simplement l'objet ModelState :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X