2011-10-21 64 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

您可以创建私有方法并让它填充您的列表(如果它尚未填充),然后返回列表。这样,您只需要在第一次调用该方法时填充该方法,并将脆弱代码从控制器的构造函数中取出。处理您的操作方法中的异常比其他地方更容易。