MVC Controller.OnException для разных типов результатов - PullRequest
2 голосов
/ 12 октября 2010

Я пытаюсь найти идеальную стратегию обработки исключений для моего проекта MVC. Я сделал следующее и ищу отзывы.

Проблема:

У меня есть разные типы результатов (Страницы, Частичные страницы, JSON, Файлы и т. Д.). Controller.OnException() не имеет простого способа определить, какого результата ожидает клиент. Безо всякого особенного я предоставляю HTML-страницу, когда им нужен JSON и т. Д., Что приводит к проблемам с отображением.

Решение:

  1. У меня есть абстрактный BaseController, в котором есть такие служебные функции, как HandleJsonException(), HandlePartialPageException(), HandlePageException() и т. Д. Эти функции будут:

    a) Передайте в Enterprise Library для регистрации и уведомлений.

    b) Установите представление результатов в формате, который ожидает клиент.

    c) Установите соответствующий код статуса Http для ошибки.

  2. Я делю свои действия на разные контроллеры в зависимости от типа результата. Например, вместо AbcController у меня есть AbcPageController и AbcJsonController. OnException для этого контроллера вызывает один из утилит базового класса.

  3. JavaScript (для представлений JSON и Partial Page) просматривает код состояния для управления поведением в некоторых случаях.

Меня беспокоит то, что логика отображения определяет дизайн контроллеров и, следовательно, влияет на маршрутизацию (не URL-адреса, а, разумеется, маршруты). Кроме того, это нарушает предыдущие стратегии наследования в отношении общего OnAuthenticate на базовых контроллерах.

В любом случае ... Ищете обзор. И, возможно, ссылки на решения этой проблемы других людей.

Приветствия

Ответы [ 2 ]

1 голос
/ 12 октября 2010

Controller.OnException () не может легко определить, какого результата ожидает клиент

Вы можете использовать заголовок запроса Accept, который отправляют уважаемые клиенты, чтобы указать, какие типы контента они поддерживают и ожидают взамен. Например, если вы используете метод jquery.getJSON(), он отправит следующий заголовок: Accept: application/json, text/javascript, */*. Как вы видите, application/json является предпочтительным форматом здесь, и вы можете использовать эту информацию в вашем контроллере.

0 голосов
/ 05 ноября 2010

В итоге я отказался от этого подхода.

Обработанные ошибки вернут соответствующий результат непосредственно из действия контроллера.

Необработанные ошибки, исправленные в Controller.OnException:

а) установите HttpStatusCode на 500. б) сделать полную HTML-страницу с ошибкой нашего приложения c) установите для свойства handled значение true, чтобы пользовательские страницы ошибок не появлялись.

Если вызывающая сторона ожидает чего-то другого, кроме HTML-страницы (Ajax JSON, Partial Page, XML и т. Д.), Она проверит код 500 и проигнорирует содержимое HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...