【发布时间】:2014-02-19 00:33:59
【问题描述】:
我有一个在某些情况下会抛出的自定义异常。当它被抛出时,我想渲染一个特定的视图并将其输出到响应中。
在开始之前,是的,我的根级 Web.config 中有 <customErrors mode="On" />。
我所做的几乎完全符合 Darin 在 this answer 中的建议:
public class EntityNotFoundHandleErrorAttribute : HandleErrorAttribute {
public override void OnException(ExceptionContext filterContext) {
if (!filterContext.IsChildAction && !filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled && filterContext.Exception is EntityNotFoundException) {
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
ViewResult result = new ViewResult {
ViewName = this.View,
ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
TempData = filterContext.Controller.TempData
};
filterContext.Result = result;
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
}
并在 FilterConfig.cs 中注册它(从 Global.asax 调用):
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new EntityNotFoundHandleErrorAttribute() {
ExceptionType = typeof(Inspect.Models.EntityNotFoundException),
View = "NotFound",
Order = 2
});
// Commented out just to be sure this isn't screwing it up.
// filters.Add(new Utilities.ElmahHandleErrorAttribute(), 1);
}
交易是,我可以确认OnException 正在按预期运行,但视图不显示。相反,我得到了无用的黄屏死机版本,告诉我如果我想查看详细信息,我应该使用customErrors="RemoteOnly"。
如果我将filterContext.Result 更改为RedirectResult,那么所有这些东西都会起作用。但我不想那样做。我只想将视图写入响应。
【问题讨论】:
标签: c# .net asp.net-mvc asp.net-mvc-4 error-handling