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. 由于它的设置方式,MasterPage 的 PageLoad 是虚拟的,并且必须被覆盖,例如:

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

    有没有更简单的方法可以让父母的方法总是首先被调用,而无需在每个页面中显式地放入基本调用?

4

2 回答 2

4

另一种替代方法是创建从 Page 继承的超类,然后将它自己的事件处理程序添加到 Page 事件中。有时很容易忘记您可以将任意数量的处理程序附加到一个事件。

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
        }
    }
}
于 2012-07-26T18:21:26.653 回答
2
  1. 查找/替换是您的朋友。
  2. 不要覆盖继承类中的事件处理程序。相反,将基本处理程序设为私有并在继承类中创建新处理程序。或者,OnInit()在您的基类中覆盖,这样您就不必担心Page_Load首先调用哪个。

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

母版页提供开发人员传统上通过重复复制现有代码、文本和控制元素来创建的功能;使用框架集;对公共元素使用包含文件;使用 ASP.NET 用户控件;等等。

母版页结果页面组成

于 2012-07-26T18:18:57.727 回答