我应该在哪里实现Page对象 - 构造函数或OnPreInit中的功能?

时间:2009-02-24 15:45:29

标签: asp.net constructor onpreinit

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

这个问题的背景:

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


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

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

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

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

3 个答案:

答案 0 :(得分:1)

我认为你的推理非常合理 - 我同意OnPreInit是适合这种逻辑的地方。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

MSDN提供suggestions for event use。请参阅“生命周期事件”。例子:

  • PreInit - 创建或重新创建动态控件
  • Init - 使用此事件来读取或初始化控件属性。
  • 加载 - 使用OnLoad事件方法在控件中设置属性并建立数据库连接。