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

C# MVC3:如何处理控制器中的构造函数异常?,c#,asp.net-mvc-3,coding-style,C#,Asp.net Mvc 3,Coding Style,我有一个控制器,具有多个操作方法,需要来自某个数据库的相同数据列表。由于大多数操作都需要访问该列表,因此我在控制器的构造函数中直接使用必需的数据项列表快速填充了一个私有成员变量 在数据库崩溃并在构造函数中抛出异常之前,一切都很好。显然,这绕过了正常的HandleError功能 我的目标是捕获此异常并将用户重定向到错误视图 为所有操作加载数据的正确方法是什么 将数据库调用放在OnActionExecuting中是否合适 是否有某种方法可以使用加载数据的属性来装饰特定的操作 我是不是想得太多了?(

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

在数据库崩溃并在构造函数中抛出异常之前,一切都很好。显然,这绕过了正常的HandleError功能

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

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

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

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

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

如果在每个操作中不需要模型,但在每个视图中,您可以使用将其外部化为一个小部件。

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

正在为每个请求实例化控制器(作为对象)。因此,无需优化控制器中的数据,这些数据将在许多操作中“重用”(正如Jeff Reddy所建议的)。除非您从另一个操作方法显式调用一个操作方法(无论如何,这是一种糟糕的做法)

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


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

Sergey,您只是重申了我的建议。获取数据并从每个操作调用的私有方法。当我说列表数据只是第一次填充时,我暗示要缓存它。后续调用将从缓存列表数据的位置获取列表数据。