返回带有actionResult的错误消息

42

在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);
    }
}
5个回答

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()

您可以选择在哪里显示错误信息。如果没有错误,它就不会显示,但如果有错误,您将会看到一个列出所有错误的部分。


我在这个问题上有点犹豫!看起来 OP 的使用案例是当某个服务不可用时发生异常。所以这个问题不是出在模型上,对吧?而是处理过程中的某些事情,所以我觉得这个答案错误地使用了 ModelState。- 如果 OP 想显示警告而不是错误,就没有什么可以切换的了。你有什么想法? - Zimano

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

2
你从哪里获取到JsonError的? - Ehsan Zargar Ershadi
1
@EhsanZargarErshadi:我想我找到了它:https://learn.microsoft.com/en-us/uwp/api/windows.data.json.jsonerror - Matt
1
感谢这一行代码:HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest; - Govinda Rajbhar
1
只是为了补充答案。您可以将错误消息放到StatusDescription中。此外,如果您处理异常,则需要重写MVC控制器的OnException方法。 - alehro

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 error statusText is always "error")。 TLDR。 Response.TrySkipIisCustomErrors = true; Response.StatusCode = (int)HttpStatusCode.BadRequest; Response.ContentType = "text/plain"; return Content("Error" + Environment.NewLine + ex.Message);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接