【问题标题】:ASP.NET MVC Exception Handling with AJAX/JSON使用 AJAX/JSON 处理 ASP.NET MVC 异常
【发布时间】:2015-12-02 19:26:19
【问题描述】:

我在控制器中有几种方法,如下所示:

[HttpPost]
public ActionResult AddEditCommentToInvoice(string invoiceNumber, string comments)
{
    var response = new { success = true, msg = "Comment saved", statusMsg = "Comment saved" };

    try
    {
        var recordsModified = invoiceService.AddCommentsToInvoice(invoiceNumber, comments);
        Log.Info(recordsModified ? "Updated Comment" : "Did not update Comment");

    } catch (Exception ex) {
        Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        return Json(new {
            success = false,
            msg = "There is missing field data",
            statusMsg = ex.Message
        }, JsonRequestBehavior.AllowGet);
    }

    return Json(response, JsonRequestBehavior.AllowGet);
}

虽然这段代码有效,但我不喜欢这种方法,因为:

  1. 尝试/捕获很昂贵
  2. 代码捕获 System.Exception
  3. 代码很丑

现在我知道我可以使用 OnException 或 HandleError 属性。
我还对 ELMAH 做了一些研究,这看起来很有希望。

但我仍然想通过 AJAX 向我的用户返回 JSON 以指示操作是否成功。

所以我的问题是,有没有人使用这三种方法中的任何一种(或者特别是 ELMAH)通过 AJAX 返回 JSON?

【问题讨论】:

  • ELMAH 仅监控和报告未处理的异常,它不会修改您的应用程序流程,属性方法是您的最佳选择。
  • 我做同样的事情,我一直讨厌它。我期待看到解决方案。它一直是我的“技术债务”中的一项。
  • @kryptonkal - 我刚遇到这个 - plainoldstan.blogspot.cz/2012/08/…

标签: asp.net json ajax asp.net-mvc


【解决方案1】:

我使用另一种方法,这种方法可以在控制器级别或通过 GlobalFilters 全局应用。在我的 MVC 控制器中,您可以重写 OnActionExecuted 方法,然后执行以下操作:

   protected override void OnActionExecuted(ActionExecutedContext filterContext)
   {
      if (filterContext.Exception != null)
      {
         filterContext.Result = Json(new { success = false });
         return;
      }

      base.OnActionExecuted(filterContext);
   }

这也可以作为动作过滤器属性来完成。您不需要在控制器中进行任何异常处理 - 如果发生异常,则会在结果的上下文中进行处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2012-05-04
    • 1970-01-01
    • 2019-03-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多