3

我一直在思考的一个问题 - Stackoverflow 用户通常会在构造函数中实现重要的功能(特别是在派生自 System.Web.UI.Page 类的类中),还是应该让这里的逻辑尽可能简单并且而是在 OnPreInit 中实现功能(使用构造函数简单地实例化页面其余部分功能所需的对象/值)?这种情况是否有“最佳实践”方法?

这个问题的背景:

我正在处理的系统具有相当深的页面层次结构 - 实际页面派生自大约 10 个链接的页面对象:

-- System.Web.UI.Page
----- CustomPage1 : System.Web.UI.Page
-------- CustomPage2 : CustomPage1
-  -  -  -  -  ETC

每个页面都添加了一个特定的功能,并且通常依赖于自定义页面构造函数中运行的代码,或者功能本身在构建期间直接运行。

最能说明我的问题的示例是将自定义对象从我们的数据库加载到页面的页面,以便它们在页面生命周期中可用 - 在页面构建期间,与数据库建立连接,然后使用正确的值填充公共属性。

在我看来,这最好从 OnPreInit 事件中完成,主要是因为我们在父逻辑运行之前有更大的灵活性来执行一些页面级别的检查(例如,我们是否应该阻止调用此功能)(假设在构造函数中的顺序执行将在子类之前构造父类)。从 OO 的角度来看,OnPreInit 似乎是实现此功能的更合适的领域 - 页面构建应该处理页面的构建、设置任何默认值等,然后 OnPreInit 将用于执行在页面的生命周期。

4

3 回答 3

1

我认为您的推理非常合理-我同意这OnPreInit是这种逻辑的适当位置。

于 2009-02-24T15:50:29.320 回答
1

根据实际功能,我建议使用 OnInit 或 OnLoad 而不是 OnPreInit。引入 OnPreInit 是为了支持动态设置主题或母版页,这是您在生命周期后期无法执行的操作。

于 2009-02-24T16:02:45.810 回答
0

请记住,如果是回发,则控件值尚未从 ViewState OnPreInit 恢复。

MSDN 给出了事件使用的建议。请参阅“生命周期事件”。例子:

  • PreInit - 创建或重新创建动态控件
  • Init - 使用此事件来读取或初始化控件属性。
  • Load - 使用 OnLoad 事件方法在控件中设置属性并建立数据库连接。
于 2009-02-24T16:09:45.683 回答