2011-10-21 9 views
2

私は、特定のデータベースからの同じデータリストを必要とするいくつかのアクションメソッドを持つコントローラを持っています。ほとんどのアクションはリストにアクセスする必要があるため、私はすぐに自分のコントローラーのコンストラクターで必要なデータ項目のリストを直接privateメンバー変数に取り込みました。MVC3:コントローラでコンストラクタ例外を処理する方法は?

データベースがダウンしてコンストラクタに例外がスローされるまで、すべて正常であり、良好でした。明らかに、これは通常のHandleError機能を回避します。

私の目標は、この例外をキャッチし、ユーザーがエラービューにリダイレクトすることです。

  • すべてのアクションのデータをロードする適切な方法は何ですか?
  • OnActionExecutingでデータベース呼び出しを行うのが適切ですか?
  • データを読み込む属性を使用して特定のアクションを装飾する方法はありますか?
  • 私はそれを熟考していますか? (結局、私はちょうどコントローラでプライベートメソッドをドロップし、データを必要とする各アクションからそれを呼び出すことができます)

答えて

1

コントローラ(オブジェクトとして)は、すべての要求に対してのためにがインスタンス化されています。したがって、コントローラをコントローラ内で最適化する必要はありません。これは多くのアクションで「再利用」されるでしょう(Jeff Reddyの提案)。他のアクションメソッドから明示的にアクションメソッドを呼び出さない限り(これはとにかく悪い習慣です)。

データベースからデータを取得し、すべてのアクションで呼び出すGetData()メソッドを作成します。

ただし、同じデータを繰り返し取得する高価なデータベースの往復を避けたい場合は、HttpRuntime.Cacheの使用を検討することをお勧めします。 GetData()への最初の呼び出しでそこにデータを保存し、後続の要求でキャッシュから取得することができます。

+0

Sergey、あなたは私が提案したことを繰り返し強調しました。データを取得し、それぞれのアクションから呼び出されるプライベートメソッド。リストデータをキャッシュすることを暗黙のうちに提案しました。それ以降の呼び出しでは、キャッシュされた場所からリストデータが取得されます。 –

0

すべてのあなたのコントローラのアクション内のモデルが必要な場合は、あなたが与えられたためcustom model binderを定義することができますデータベースを照会してこのモデルにデータを入力する方法をオーバーライドします(BidModel)。次に、あなたのコントローラのアクションは、アクションの引数としてこのモデルを取ることができる:

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

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

あなたは、各アクションの内部でモデルを必要としませんが、各ビュー内であなたがHtml.RenderAction helperを使用してウィジェットとしてそれを外部化することができれば。

2

プライベートメソッドを作成し、それがまだ入力されていない場合はリストを作成してからリストを返すことができます。この方法では、メソッドが最初に必要なときにメソッドを呼び出すだけで、コントローラのコンストラクタから脆弱なコードを取り出すことができます。他の場所よりもアクションメソッドで例外を処理する方がはるかに簡単です。

関連する問題