2012-07-26 57 views
2

假设我有一个Web项目和一堆不同的Web窗体,实际上所有不同的类继承System.Web.UI.Page页面继承

我决定在我的项目中使用的任何页面的Page_Load方法中有一些字段,方法和一些事情发生是很好的。

关闭袖口,我想也许是为了创建一个班级,说MasterPage,它具有我想要的所有字段和方法(使用protected级别),并且此类继承System.Web.UI.Page

然后,我的项目中的每个页面现在应该继承MasterPage而不是System.Web.UI.Page

虽然这工作,有一些问题。

  1. 我无法真正“抓住”仍然很容易从System.Web.UI.Page继承的表单。有没有简单的方法?

  2. 由于它是安装的方式,将母版的pageLoad的是虚拟的,必须重写例如:

    protected override void Page_Load(object sender, EventArgs e) 
    { 
        base.Page_Load(sender, e); 
        // rest of stuff for this page... 
    } 
    

    有没有更简单的方法有父母的方法总是先叫没有在明确地把在每个页面调用基地?

回答

2
  1. 查找/替换是你的朋友。
  2. 请勿在继承类中重写事件处理程序。相反,使基础处理程序保持私有状态,并在继承类中创建新的处理程序。或者,在您的基类中覆盖OnInit(),这样您就不必担心哪个Page_Load被首先调用。

另一个完全不同的解决方案是使用ASP.NET Master Pages。这通常是跨Web应用程序中的所有页面共享内容的最佳方式。

母版页提供的功能,开发人员通常通过复制现有的代码,文本和控制元件 屡创 ;使用框架集;使用常用元素的包含文件;使用ASP.NET用户控件的 ;等等。

Master page resulting page composition

+0

我走了OnInit路线,可能会尝试在不同的项目上的主东西。伯特的答案也有效,也很有用。 – user17753 2012-07-26 20:07:02

4

另一种替代方法是创建从页面继承,然后只需添加它自己的事件处理程序的页面事件的超类。有时很容易忘记,您可以附加尽可能多的处理程序。

namespace MyProject 
{ 
    public partial class CustomPage: System.Web.UI.Page 
    { 
     public CustomPage() 
     { 
      this.Init += new EventHandler(CustomPage_Init); 
      this.Load += new EventHandler(CustomPage_Load); 
      this.PreRender += new EventHandler(CustomPage_PreRender); 
      this.Unload += new EventHandler(CustomPage_Unload); 
     } 

     protected void CustomPage_Load(object sender, EventArgs e) 
     { 
      //do stuff 
     } 

    ... 
    } 
} 

然后在您的页面中,继承并执行通常所做的操作,并且两个事件都会触发。

namespace MyProject 
{ 
    public partial class NewPage: CustomPage 
    { 
     void Page_Load(object sender, EventArgs e) 
     { 
      //do more stuff 
     } 
    } 
}