I've got a catchall in my base controller that handles errors I don't catch. It goes roughly like this:
protected override void OnException(ExceptionContext filterContext)
{
// Bail if we can't do anything
if (filterContext == null)
return;
// log
var ex = filterContext.Exception ??
new Exception("No further information exists.");
LogException(ex);
filterContext.ExceptionHandled = true;
var data = new ErrorPresentation
{
ErrorMessage = HttpUtility.HtmlEncode(ex.Message),
TheException = ex
};
filterContext.Result = View("Error", data);
base.OnException(filterContext);
}
Now this works great if the error happens in the controller. The issue is that if the error is during the aspx page rendering (say, in an HtmlHelper method), the whole error view gets rendered, in place on the page where the error occurred. That means that the entire error page (MasterPage and all) gets rendered within the page that's errored. Not exactly the expected behavior.
I've tried changing View to a RedirectToAction, but that won't work as a route doesn't exist for every controller (Home/Error, Configuration/Error, etc).
How can I get this to work for both errors in the controller AND errors on the page?