如何在ASP.NET MVC中以JSON格式返回500错误?

11

当ASP.NET MVC抛出异常时,它返回一个500错误和响应类型text/html,这显然是无效的JSON格式。

我想要对期望JSON响应的Ajax请求做出错误响应,并将其显示给用户。

  1. 是否可能返回状态码为500的JSON?

  2. 当问题是缺少参数时,在调用控制器之前发生500错误,因此控制器解决方案可能不起作用。例如,在调用通常返回JsonResult的Action时,如果缺少必需的参数,则ASP.NET MVC会将以下内容发送回客户端:

 

'/' 应用程序中的服务器错误。 参数字典包含非可空类型'system.int32'的参数'id'的空条目,该参数用于 'bhh' 中的方法 'system.web.mvc.jsonresult edituser(int32、system.string、system.string、system.string、system.string、system.string、system.string、system.string、system.string)'。 可选参数必须是引用类型、可空类型或声明为可选参数。 参数名称:parameters

我正在使用jQuery,有更好的处理方法吗?

1个回答

10

你可以使用自定义的错误处理程序过滤器:

public class AjaxErrorHandler : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.ExceptionHandled = true;
            filterContext.Result = new JsonResult
            {
                Data = new { errorMessage = "some error message" }
            };
        }
    }
}

然后装饰你通过Ajax调用的控制器/操作,甚至可以注册为全局过滤器。

然后,在执行Ajax请求时,您可以测试错误属性是否存在:

$.getJSON('/foo', function(result) {
    if (result.errorMessage) {
        // Something went wrong on the server
    } else {
        // Process as normally
    }
});

抱歉,但我认为我如何在客户端使用jQuery解析无效的JSON响应时可以精确地解析错误。我是否可以使用正则表达式解析斜体? - user605334
@jQuery 在 Planet MySQL 上,为什么响应会是无效的 JSON? - Darin Dimitrov
我不返回,但ASP.NET MVC会返回$.trim($(data).filter(":gt(2)").text().split('\n\n')[3])。尝试使用返回内容进行解析,它将解析错误。 - user605334
1
另一种选择是添加以下行:filterContext.HttpContext.Response.StatusCode = 500;,然后在JSON调用上设置一个错误处理程序,如下所示:error: function(error) { ... }。在我看来,这将是更清晰的选项,因为错误将由错误处理程序处理... - Manfred

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