Библиотека - Любой набор классов или компонентов, которые могут использоваться в качестве клиента, считает соответствие для выполнения определенной задачи.
Платформа - передает под мандат определенные инструкции для Вас к "плагину" во что-то большее, чем Вы. Вы просто обеспечиваете части, характерные для Вашего приложения/требований в опубликованном - требуемый способ, так, чтобы 'framwework мог сделать Вашу жизнь легкой'
Вам понадобится способ отслеживать, в каком состоянии находится страница, чтобы вы могли различать, выполняете ли вы действие (в этом случае вы хотите заменить результат) или выполняете result - в этом случае вы хотите отбросить содержимое ответа и выполнить новый ViewResult для ошибки. Одним из способов решения этой проблемы было бы сохранение флага в базовом контроллере. Вы также можете определить это по типу исключения. Я не уверен, насколько это будет надежно.
Как только вы выясните, какое состояние вы можете сделать:
var view = View("Error", data );
if (executingResult)
{
filterContext.HttpContext.Response.ClearContent();
view.ExecuteResult();
}
else
{
filterContext.Result = view;
base.OnException( filterContext );
}
Комментарий: Обычно я не сторонник этого. Я думаю, что действие вашего контроллера должно гарантировать представлению, что все данные, которые ему нужны, есть, или ваше представление должно быть написано в защитной форме, чтобы гарантировать, что никаких исключений (особенно NullReferenceExceptions) не произойдет.
Это старый вопрос, но для тех, кто отчаянно ищет, этот код работает для меня, для исключений где угодно - в контроллере, действии или результате действия, то есть представлении или любых помощниках, которые просмотр звонков. (Я взял его из книги Стива Сандерсона, чтобы отдать должное его месту):
protected override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled)
return;
//Let the request know what went wrong
filterContext.Controller.TempData["Exception"] = filterContext.Exception;
//redirect to error handler
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(
new { controller = "Exception", action = "HandleError" }));
// Stop any other exception handlers from running
filterContext.ExceptionHandled = true;
// CLear out anything already in the response
filterContext.HttpContext.Response.Clear();
}