使用actionResult返回错误消息

Joh*_*ohn 30 c# asp.net-mvc actionresult asp.net-mvc-3

MVC App,客户端向服务器发出请求,发生错误,要将msg发送回客户端.尝试了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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Shy*_*yju 29

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

catch (Exception ex)
{
   // to do :log error
   return View("Error");
}
Run Code Online (Sandbox Code Playgroud)

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

如果您的请求是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"});
  }
} 
Run Code Online (Sandbox Code Playgroud)

如果要在用户提交的表单中显示错误,可以使用ModelState.AddModelError方法以及类似的Html帮助程序方法Html.ValidationSummary,以他提交的形式向用户显示错误.


Mik*_*oud 21

一种方法是使用ModelState:

ModelState.AddModelError("", "Error in cloud - GetPLUInfo" + ex.Message);
Run Code Online (Sandbox Code Playgroud)

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

@Html.ValidationSummary()
Run Code Online (Sandbox Code Playgroud)

您希望显示错误的位置.如果没有错误,它将不会显示,但如果有,您将获得列出所有错误的部分.


Ale*_*eev 10

在Controller Action内部,您可以访问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;
}
Run Code Online (Sandbox Code Playgroud)

  • 你从哪里得到JsonError? (2认同)

the*_*Law 5

在您的视图中插入

@Html.ValidationMessage("Error")
Run Code Online (Sandbox Code Playgroud)

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

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