Проблема с универсальной основной обработкой ошибки контроллера в ASP.NET MVC

Библиотека - Любой набор классов или компонентов, которые могут использоваться в качестве клиента, считает соответствие для выполнения определенной задачи.
Платформа - передает под мандат определенные инструкции для Вас к "плагину" во что-то большее, чем Вы. Вы просто обеспечиваете части, характерные для Вашего приложения/требований в опубликованном - требуемый способ, так, чтобы 'framwework мог сделать Вашу жизнь легкой'

7
задан 22 July 2009 в 15:25
поделиться

2 ответа

Вам понадобится способ отслеживать, в каком состоянии находится страница, чтобы вы могли различать, выполняете ли вы действие (в этом случае вы хотите заменить результат) или выполняете result - в этом случае вы хотите отбросить содержимое ответа и выполнить новый ViewResult для ошибки. Одним из способов решения этой проблемы было бы сохранение флага в базовом контроллере. Вы также можете определить это по типу исключения. Я не уверен, насколько это будет надежно.

Как только вы выясните, какое состояние вы можете сделать:

 var view = View("Error", data );
 if (executingResult)
 {
     filterContext.HttpContext.Response.ClearContent();
     view.ExecuteResult();
 }
 else
 {
      filterContext.Result = view;
      base.OnException( filterContext );
 }

Комментарий: Обычно я не сторонник этого. Я думаю, что действие вашего контроллера должно гарантировать представлению, что все данные, которые ему нужны, есть, или ваше представление должно быть написано в защитной форме, чтобы гарантировать, что никаких исключений (особенно NullReferenceExceptions) не произойдет.

1
ответ дан 6 December 2019 в 19:41
поделиться

Это старый вопрос, но для тех, кто отчаянно ищет, этот код работает для меня, для исключений где угодно - в контроллере, действии или результате действия, то есть представлении или любых помощниках, которые просмотр звонков. (Я взял его из книги Стива Сандерсона, чтобы отдать должное его месту):

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();
    }
12
ответ дан 6 December 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: