我建议实现一个自定义 HandleErrorAttribute 操作过滤器。
查看此链接了解更多详情:
http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx
设置一个 HandleErrorAttribute 动作过滤器可以让您完全控制过滤器处理哪些动作,并且很容易在控制器级别进行设置,甚至可以通过在自定义基础控制器上设置站点级别进行设置,并拥有您的所有控制器都继承自基本控制器。
我对此做的其他事情是,我有一个单独的 HandleJsonErrorAttribute,它通过返回 Json 响应而不是自定义页面来响应 Ajax 调用。
更新:
根据以下一些问题,这是我使用的HandleJsonErrorAttribute 示例:
public class HandleJsonErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
var serviceException = filterContext.Exception as ServiceException;
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } };
filterContext.ExceptionHandled = true;
}
}
这是我用来处理这些未经处理的异常的 jQuery:
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
showPopdown($.parseJSON(jqXHR.responseText).message);
});
这让我的 Ajax 方法变得非常轻量——它们只处理返回正常的 Json,并且在发生未处理的异常时,带有错误状态代码的消息会被包装在 Json 中并返回。
另外,在我的实现中,我有一个从服务中抛出的自定义 ServiceException,它从服务层发送消息而不是通用消息。