I have a controller with several action methods requiring the same list of data from a certain database. Since most of the actions were going to need access to the list, I quickly populated a private member variable with necessary list of data items directly in the constructor of my controller.
All was well and good until the database went down and an exception was thrown in the constructor. Apparently, that circumvents the normal HandleError functionality.
My goal is for this exception to be caught and the user redirected to an error view.
- What is the proper way to load the data for all actions?
- Is it appropriate to put a database call in OnActionExecuting?
- Is there some way to do decorate the specific actions with an attribute that loads the data?
- Am I over-thinking it? (After all, I could just drop a private method in the controller and call it from each action requiring the data)
Controllers (as objects) are being instantiated for every request. Therefore, there is no need to optimize data within controller which would be “reused” in many actions (as Jeff Reddy suggested). Unless you call an action method explicitly from another action method (which is bad practice anyway).
Make a private method GetData() that gets data from database and call it in every action.
However, you probably do want to avoid expensive database round-trips that get the same data over and over, then consider using HttpRuntime.Cache. You could save data there on the first call to GetData() and retrieve it from cache on subsequent requests.