各位,
我遇到一个奇怪的问题。最近看了thePhile的源码,
觉得其中的一些做法不错,于是自己效仿之,结果就是不行。
thePhile的一个做法是将整个站点的页面抽象一个PhilePage,
这个页面处理最一般的事务,
其他的页面继承自这个页面,
我打开源代码,并追踪发现,确实是严格按照顺序执行的:即父类的构造函数-》父类的Page_Load()-》子类的Page_Load()。但现在我遇到问题了:
我以这种相同的方式处理,结果执行顺序发生了变化:父类的构造函数-》子类的Page_Loag()-》父类的Page_Load(),
追踪了多次都是这样的,
各位可知这是为何?急死我了真是!

解决方案 »

  1.   

    public class BasePage
    {
        public BasePage()
        {
            Console.WriteLine("BasePage Inited");
        }
        public void Page_Load()
        {
            Console.WriteLine("Base Page Loaded");
        }
    }
    假设父类是上面这样.那么你说的这两个顺序用子类实现就是:
    1.父类的构造函数-》父类的Page_Load()-》子类的Page_Load()
    public SubPage : BasePage
    {
        public SubPage()
        {
            Console.WriteLine("Sub Page Inited");
        }
        public void Page_Load()
        {
            base.Page_Load();
            Console.WriteLine("Sub Page Loaded");
        }
    }2. 父类的构造函数-》子类的Page_Loag()-》父类的Page_Load()public SubPage : BasePage
    {
        public SubPage()
        {
            Console.WriteLine("Sub Page Inited");
        }
        public void Page_Load()
        {
            Console.WriteLine("Sub Page Loaded");
            base.Page_Load();
        }
    }
      

  2.   

    看一下隐藏代码你就知道为什么了:
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.DropDownList1.SelectedIndexChanged += new System.EventHandler(this.DropDownList1_SelectedIndexChanged);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
    建议看一下页面生成的流程
      

  3.   

    经过仔细对比,终于发现了这个隐含的机关:
    thePhile的页面的OnInit(EventArgs e)是这样的,
    override protected void OnInit(EventArgs e)
    {
    base.OnInit(e);
    InitializeComponent();
    }
    而默认生成的页面的OnInit(EventArgs e)是这样的:
    override protected void OnInit(EventArgs e)
    {
    InitializeComponent();
    base.OnInit(e);
    }看来自己太粗心了!
    谢谢两位!