MVC3:如何处理控制器中的构造函数异常?

时间:2011-10-21 21:16:10

标签: c# asp.net-mvc-3 coding-style

我有一个带有多个操作方法的控制器,需要来自某个数据库的相同数据列表。由于大多数操作都需要访问列表,因此我很快直接在控制器的构造函数中填充了一个私有成员变量和必要的数据项列表。

在数据库发生故障并且构造函数中抛出异常之前,一切都很顺利。显然,这会绕过正常的HandleError功能。

我的目标是捕获此异常并将用户重定向到错误视图。

  • 为所有操作加载数据的正确方法是什么?
  • 在OnActionExecuting中放置数据库调用是否合适?
  • 是否有某种方法可以使用加载数据的属性来修饰特定操作?
  • 我过度思考了吗? (毕竟,我可以在控制器中删除一个私有方法,并从需要数据的每个操作中调用它

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

控制器(作为对象)正在为每个请求实例化 。因此,无需优化控制器中的数据,这些数据将在许多操作中“重复使用”(如Jeff Reddy建议的那样)。除非你从另一个动作方法中明确地调用一个动作方法(无论如何这都是不好的做法)。

创建一个私有方法GetData(),它从数据库中获取数据并在每个操作中调用它。

但是,您可能希望避免昂贵的数据库往返,一遍又一遍地获取相同的数据,然后考虑使用HttpRuntime.Cache。您可以在第一次调用GetData()时保存数据,并在后续请求中从缓存中检索数据。

答案 2 :(得分:0)

如果您需要所有控制器操作中的模型,您可以为给定模型定义custom model binder并覆盖BidModel方法,该方法将查询数据库并填充此模型。然后您的控制器操作可以将此模型作为操作参数:

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

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

如果您不需要每个操作中的模型,但在每个视图中,您可以使用Html.RenderAction helper将其外部化为窗口小部件。