MVC3: Как обработать исключение конструктора в контроллере? - PullRequest
2 голосов
/ 22 октября 2011

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

Все было хорошо, пока база данных не вышла из строя и в конструктор не было сгенерировано исключение. По-видимому, это обходит нормальную функциональность HandleError.

Моя цель - чтобы это исключение было перехвачено, а пользователь перенаправлен в представление ошибок.

  • Как правильно загрузить данные для всех действий?
  • Уместно ли помещать вызов базы данных в OnActionExecuting?
  • Есть ли способ украсить определенные действия атрибутом, который загружает данные?
  • Я слишком обдумываю это? (В конце концов, я мог бы просто добавить приватный метод в контроллер и вызывать его из каждого действия, требующего данных )

Ответы [ 3 ]

2 голосов
/ 22 октября 2011

Вы можете создать приватный метод и заполнить его список (если он еще не заполнен), а затем вернуть список.Таким образом, вы вызываете метод только для заполнения его, когда он нужен в первый раз, и вы извлекаете хрупкий код из конструктора вашего контроллера.Намного легче обработать исключение в ваших методах действия, чем где-либо еще.

1 голос
/ 22 октября 2011

Контроллеры (как объекты) создаются для каждого запроса . Следовательно, нет необходимости оптимизировать данные в контроллере , которые были бы «повторно использованы» во многих действиях (как предложил Джефф Редди). Если вы не вызываете метод действия явно из другого метода действия (что в любом случае является плохой практикой).

Создайте закрытый метод GetData (), который получает данные из базы данных и вызывает их при каждом действии.

Однако вы, вероятно, хотите избежать дорогостоящих обходов базы данных, которые получают одни и те же данные снова и снова, а затем подумайте об использовании HttpRuntime.Cache. Вы можете сохранить данные там при первом вызове GetData () и извлечь их из кэша при последующих запросах.

0 голосов
/ 22 октября 2011

Если вам нужна модель во всех действиях вашего контроллера, вы можете определить пользовательский связыватель модели для данной модели и переопределить метод BidModel , который будет запрашивать базу данных и заполнять эту модель.,Тогда действия вашего контроллера могут принять эту модель в качестве аргумента действия:

public ActionResult Foo(MyModel model)
{
    ...
}

public ActionResult Bar(MyModel model)
{
    ...
}

Если вам не нужна модель внутри каждого действия, но внутри каждого представления вы можете вывести ее как виджет с помощью Html.Помощник RenderAction .

...