【问题标题】:MVC3: How to handle constructor exception in controller?MVC3:如何处理控制器中的构造函数异常?
【发布时间】:2011-10-22 05:53:46
【问题描述】:

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

一切都很好,直到数据库出现故障并在构造函数中引发异常。显然,这绕过了正常的 HandleError 功能。

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

  • 为所有操作加载数据的正确方法是什么?
  • 将数据库调用放在 OnActionExecuting 中是否合适?
  • 有没有办法用加载数据的属性来装饰特定的动作?
  • 我是不是想多了? (毕竟,我可以在控制器中放置一个私有方法,然后从需要数据的每个操作中调用它

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      控制器(作为对象)被实例化为每个请求。因此,没有必要优化 控制器内 将在许多操作中“重用”的数据(正如 Jeff Reddy 建议的那样)。除非您从另一个操作方法显式调用操作方法(无论如何这都是不好的做法)。

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

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

      【讨论】:

      • Sergey,你只是重申了我的建议。获取数据并从每个操作中调用的私有方法。当我说它只是第一次填充时,我隐含地建议缓存列表数据。后续调用将从缓存的位置获取列表数据。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-09-26
        • 1970-01-01
        • 1970-01-01
        • 2011-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多