【问题标题】:MVC Rethrow custom exception as JSONMVC 将自定义异常重新抛出为 JSON
【发布时间】:2014-10-14 23:08:54
【问题描述】:

我正在从我的 MVC 视图调用 Web 服务,并希望在异常抛出时使用 jquery ajax 错误功能。

我正在尝试将自定义创建的异常从我的 MVC 业务层抛出到我的表示层控制器中,并将其作为 json 响应重新抛出。

我可以成功抛出我的自定义异常,问题是它以 HTML 视图的形式出现。我已经看到了声明自定义错误响应的方法,但我希望能够直接将异常重新抛出为 JSON。

有什么想法吗?

Javascript:

$.ajax({
            type: "POST",
            url: 'create',
            data: "{userDetails:" + JSON.stringify(details) + "}",
            contentType: "application/json; charset=utf-8",
            success: function (data) {
                data = data.d;
                redirectSuccess();
            },
            error: function(err) {
                //display thrown exception here
            }
        });

CS

public JsonResult create(MyModel.New details)
        {
            try
            {
                Library.insert(details);
                return Json(true); 
            }
            catch (Exception ex)
            {
                throw;
            }
        }

提前感谢您的帮助!

【问题讨论】:

  • This answer 很好地满足了需求。你可以取出自定义视图部分,只返回一个Json 对象。

标签: c# jquery asp.net asp.net-mvc json.net


【解决方案1】:

我认为它不像你认为的那样工作,你需要将异常作为响应传递给前端。

public JsonResult create(MyModel.New details)
    {
        try
        {
            Library.insert(details);
            return Json(true); 
        }
        catch (Exception ex)
        {
            return Json(ex.Message); 
        }
    }

然后用JS处理为成功。

$.ajax({
        type: "POST",
        url: 'create',
        data: "{userDetails:" + JSON.stringify(details) + "}",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            if (data.Message)
            {
             //display error
             }else{
            data = data.d;
            redirectSuccess();}
        },
        error: function(err) {
            //display thrown exception here
        }
    });

【讨论】:

  • 我希望避免这种情况。我以前使用 .Net2 和 webmethods,我的异常会直接作为 json 抛出到 jquery ajax 错误函数中。仍然存在使用 jquery ajax 错误的情况,例如禁止请求等,所以我不希望在客户端双重处理错误。
【解决方案2】:

我最终找到了一个合适的解决方案。

对于想要对我提出的问题有类似答案的任何人,我所做的是声明一个自定义过滤器。主要部分是将过滤结果设置为以 JSON 格式返回,但即使这样,它也会在 jquery ajax 调用中返回成功,因为它返回的状态为 200,jquery ajax 将其读取为成功。

Jquery ajax 将 200 之外的任何状态读取为错误,因此您可以看到我将状态代码更改为我创建并将记录的自定义数字,因此 jquery ajax 看到错误并将其抛出到 ajax 错误。

public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            filterContext.HttpContext.Response.StatusCode = 11001;
            filterContext.ExceptionHandled = true;
            filterContext.Result = new JsonResult

            {
                Data = new { success = false, error = filterContext.Exception.ToString() },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
        }
    }

要引用当前过滤器,只需将错误处理程序属性添加到函数中,如下第一行所示:

[MyErrorHandler]
public JsonResult create(MyModel.New details)
    {
        try
        {
            Library.insert(details);
            return Json(true); 
        }
        catch (Exception ex)
        {
            return Json(ex.Message); 
        }
    }

【讨论】:

  • 您的操作代码示例是否正确?你实际上并没有在这里抛出异常。您正在捕获异常并返回 Json 对象。
猜你喜欢
  • 2020-02-18
  • 1970-01-01
  • 2013-02-07
  • 2011-10-06
  • 2021-10-08
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多