MVC Rethrow自定义异常为JSON

时间:2014-08-21 10:40:39

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

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

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:3)

我不认为它的工作方式与您认为需要将异常传递给前端作为响应一样。

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