2011-10-21 63 views
2

我有一個控制器與幾個操作方法需要從某個數據庫相同的數據列表。由於大多數操作都需要訪問列表,因此我直接在控制器的構造函數中使用必要的數據項列表快速填充私有成員變量。MVC3:如何處理控制器中的構造函數異常?

一切都很好,直到數據庫出現故障並在構造函數中拋出異常。顯然,這規避了正常的HandleError功能。

我的目標是抓住這個異常並將用戶重定向到錯誤視圖。

  • 加載所有操作的數據的正確方法是什麼?
  • 在OnActionExecuting中放入數據庫調用是否合適?
  • 是否有某種方法可以用加載數據的屬性來修飾特定的操作?
  • 我過度思考嗎? (畢竟,我可能只是在控制器下降一個私有方法,並從每個動作需要的數據稱呼它)

回答

1

對於每個請求正在實例化控制器(作爲對象)。因此,不需要優化控制器內的數據,其將在許多動作中「重用」(如Jeff Reddy所建議的)。除非你明確地從另一個動作方法中調用動作方法(反正這是不好的做法)。

創建一個私有方法GetData(),它從數據庫獲取數據並在每個操作中調用它。

但是,您可能確實希望避免反覆獲取相同數據的昂貴數據庫往返行爲,然後考慮使用HttpRuntime.Cache。您可以在第一次調用GetData()時保存數據,並在後續請求中從緩存中檢索數據。

+0

謝爾蓋,你只是重申了我的建議。獲取數據並從每個操作中調用的私有方法。當我說它只是第一次填充時,我隱式建議緩存列表數據。隨後的調用會從緩存中獲取列表數據。 –

0

如果你需要的所有控制器的動作裏面的模型,你可以爲一個給定的定義custom model binder模型並覆蓋將查詢數據庫並填充此模型的BidModel方法。那麼你的控制器操作可以採取這種模式的操作參數:

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

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

如果您不需要每個動作裏面的模型,但內部的每個查看您可以外部化作爲使用Html.RenderAction helper一個小部件。

2

您可以創建私有方法並讓它填充您的列表(如果它尚未填充),然後返回列表。這樣,您只需要在第一次調用該方法時填充該方法,並將脆弱代碼從控制器的構造函數中取出。處理您的操作方法中的異常比其他地方更容易。