用actionResult返回错误信息

问题描述 投票:0回答:6

MVC应用程序,客户端向服务器发出请求,发生错误,想要将消息发送回客户端。 尝试了 HttpStatusCodeResult 但只返回 404,没有消息,我需要发送回客户端的错误详细信息。

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);
    }
}
c# asp.net-mvc asp.net-mvc-3 actionresult
6个回答
37
投票

您需要返回一个向用户提供友好错误消息的视图

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

您不应该向用户显示异常的内部详细信息(例如异常堆栈跟踪等)。您应该将相关信息记录到错误日志中,以便您可以查看它并解决问题。

如果您的请求是 ajax 请求,您可以返回带有适当状态标志的 JSON 响应,客户端可以评估该状态标志并执行进一步操作

[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"});
  }
} 

如果您想在用户提交的表单中显示错误,您可以使用

ModelState.AddModelError
方法以及 Html 帮助器方法(如
Html.ValidationSummary
等)在用户提交的表单中向用户显示错误。


27
投票

一种方法是仅使用

ModelState
:

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

然后在视图上执行如下操作:

@Html.ValidationSummary()

您想要显示错误的位置。如果没有错误,则不会显示,但如果有错误,您将看到一个列出所有错误的部分。


17
投票

在控制器操作内部,您可以访问 HttpContext.Response。您可以在此处设置响应状态,如下列表所示。

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

5
投票

在您的视图中插入

@Html.ValidationMessage("Error")

然后在模型中使用 new 之后在控制器中

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

0
投票

不确定这是否适用于所有人,但我遇到了类似的问题,在我的视图中,我将结果返回到 AJAX 调用,并且我希望显示自定义错误消息,本文为我完美解决了这个问题(ASP.NET MVC 5 ajax 错误状态文本始终为“错误”)。 太长了。

Response.TrySkipIisCustomErrors = true; Response.StatusCode = (int)HttpStatusCode.BadRequest; Response.ContentType = "text/plain"; return Content("Error" + Environment.NewLine + ex.Message);


0
投票

当客户端可以配置为处理异常时。

IActionResult GetData(string id)
{
    try
    {
        // code
    } 
    catch (Exception ex)
    {
        throw new Exception("<CustomMessage>", ex);
    }
}

当客户端只需要一个响应字符串时。

IActionResult GetData(string id)
{
    try
    {
        // code
    } 
    catch (Exception ex)
    {
        return "<ERCODE>:"+ex.Message;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.