web-dev-qa-db-fra.com

renvoyer un message d'erreur avec actionResult

MVC App, le client fait une demande au serveur, une erreur se produit, veut renvoyer le message au client. Essayé HttpStatusCodeResult mais retourne juste un 404 sans message, j'ai besoin des détails de l'erreur renvoyés au client.

public ActionResult GetPLUAndDeptInfo(string authCode)
{
    try
    {
        //code everything works fine
    }
    catch (Exception ex)
    {
         Console.WriteLine(ex.Message);
         return new HttpStatusCodeResult(404, "Error in cloud - GetPLUInfo" + ex.Message);
    }
}
30
John

Vous devez renvoyer une vue contenant un message d'erreur convivial à l'utilisateur.

catch (Exception ex)
{
   // to do :log error
   return View("Error");
}

Vous ne devriez pas montrer les détails internes de votre exception (comme une pile d'exceptions, etc.) à l'utilisateur. Vous devriez consigner les informations pertinentes dans votre journal des erreurs afin de pouvoir les consulter et résoudre le problème.

Si votre demande est une demande ajax, vous pouvez renvoyer une réponse JSON avec un indicateur d'état approprié que le client peut évaluer et effectuer d'autres actions.

[HttpPost]
public ActionResult Create(CustomerVM model)
{
  try
  {
   //save customer
    return Json(new { status="success",message="customer created"});
  }
  catch(Exception ex)
  {
    //to do: log error
   return Json(new { status="error",message="error creating customer"});
  }
} 

Si vous souhaitez afficher l'erreur dans le formulaire que l'utilisateur a soumis, vous pouvez utiliser ModelState.AddModelError méthode avec les méthodes d’aide HTML telles que Html.ValidationSummary etc pour montrer l'erreur à l'utilisateur dans le formulaire qu'il a soumis.

28
Shyju

Une approche serait d’utiliser simplement le ModelState:

ModelState.AddModelError("", "Error in cloud - GetPLUInfo" + ex.Message);

et puis sur la vue faire quelque chose comme ça:

@Html.ValidationSummary()

où vous voulez que les erreurs s'affichent. S'il n'y a pas d'erreur, il ne s'affichera pas, mais s'il y en a une section qui répertorie toutes les erreurs.

20
Mike Perrenoud

Dans Action du contrôleur, vous pouvez accéder à HttpContext.Response. Là, vous pouvez définir le statut de la réponse comme indiqué dans la liste suivante.

[HttpPost]
public ActionResult PostViaAjax()
{
    var body = Request.BinaryRead(Request.TotalBytes);

    var result = Content(JsonError(new Dictionary<string, string>()
    {
        {"err", "Some error!"}
    }), "application/json; charset=utf-8");
    HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
    return result;
}
10
Alexey Matveev

DANS ta vue insérer

@Html.ValidationMessage("Error")

puis dans le contrôleur après l'utilisation de nouveau dans votre modèle

var model = new yourmodel();
try{
[...]
}catch(Exception ex){
ModelState.AddModelError("Error", ex.Message);
return View(model);
}
5
theLaw