34

I have the following PerformanceFactsheet.aspx.cs page class

public partial class PerformanceFactsheet : FactsheetBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // do stuff with the data extracted in FactsheetBase
        divPerformance.Controls.Add(this.Data);
    }
}

where FactsheetBase is defined as

public class FactsheetBase : System.Web.UI.Page
{
    public MyPageData Data { get; set; } 
    protected void Page_Load(object sender, EventArgs e)
    {
        // get data that's common to all implementors of FactsheetBase
        // and store the values in FactsheetBase's properties
        this.Data = ExtractPageData(Request.QueryString["data"]);            
    }
}

The problem is that FactsheetBase's Page_Load is not executing.

Can anyone tell me what I'm doing wrong? Is there a better way to get the result I'm after?

Thanks

DaveDev
  • 41,155
  • 72
  • 223
  • 385
  • 1
    For the search engines: I used this Q&A to finally resolve a problem with accessing Session via a constructor in my base class, which gave the following exception: `Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive. Please also make sure that System.Web.SessionStateModule or a custom session state module is included in the \\ section in the application configuration.` – sfuqua May 02 '11 at 19:08

6 Answers6

54

We faced the similar problem, All you need to do is just register the handler in the constructor. :)

public class FactsheetBase : System.Web.UI.Page 
{ 

    public FactsheetBase()
    {
        this.Load += new EventHandler(this.Page_Load);
    }

    public MyPageData Data { get; set; }  
    protected void Page_Load(object sender, EventArgs e) 
    { 
        // get data that's common to all implementors of FactsheetBase 
        // and store the values in FactsheetBase's properties 
        this.Data = ExtractPageData(Request.QueryString["data"]);             
    } 
}

Another approach would be to override OnLoad() which is less preferred.

public class FactsheetBase : System.Web.UI.Page 
{ 

    public FactsheetBase()
    {
    }

    public MyPageData Data { get; set; }  
    protected override void OnLoad(EventArgs e)
    {
        //your code
        // get data that's common to all implementors of FactsheetBase 
        // and store the values in FactsheetBase's properties 
        this.Data = ExtractPageData(Request.QueryString["data"]);             

        base.OnLoad(e);
    }
}
this. __curious_geek
  • 42,787
  • 22
  • 113
  • 137
  • 4
    Why do you say overriding `OnLoad` is less preferred? – Jeff Sternal Apr 29 '10 at 13:37
  • 4
    because in that approach you might forget to call the base.OnLoad(e) which will affect the Page object adversely. And also the Load event is exposed on the Page object on which you can register as many as handlers you want, this way you're not chanigng anything that already exists but adding your own handler on the event. – this. __curious_geek Apr 29 '10 at 13:42
  • 11
    I agree that *forgetting to call base.OnLoad(e)* is less preferred, but it's worth noting that overriding `OnLoad` gives you control over when your code gets executed - you can say whether you want your code to go before or after other `Load` handlers. This probably isn't important very often, but it's **different**, not worse or better than adding another handler. – Jeff Sternal Apr 29 '10 at 13:59
  • 2
    Using the 1st code block, if you register an EventHandler named Page_Load, then you will get a warning saying "'FactsheetBase .Page_Load(object, System.EventArgs)' hides inherited member 'PerformanceFactsheet.Page_Load(object, System.EventArgs)'. Use the new keyword if hiding was intended.". To avoid the warning, you can change the name of the Load handler in the base class to something else, like BasePage_Load, and it will still work just the same – Eric Barr Feb 14 '17 at 21:53
7

Instead of a Page_Load() method, override OnLoad() and call base.OnLoad() in PerformanceFactsheet

n8wrl
  • 19,439
  • 4
  • 63
  • 103
6

Uhm, I maybe wrong, but I believe this is due to inheritance: you are overwriting the FactsheetBase Page_Load method in the derived class.

In order to have it executed you should do something like

public partial class PerformanceFactsheet : FactsheetBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        base.Page_Load( sender, e );
        // do stuff with the data extracted in FactsheetBase
        divPerformance.Controls.Add(this.Data);
    }
}

EDIT: n8wrl definitely gave you a cleaner solution (I am not a ASPX programmer).

NeXuS
  • 1,797
  • 1
  • 13
  • 13
  • this will not compile. It will need to be called as base.OnLoad(e); – this. __curious_geek Apr 29 '10 at 12:16
  • I tried this out @curious_geek & it worked for me. I've decided to accept your answer as correct though because NeXuS's answer requires that I have `base.Page_Load( sender, e );` in every implementor – DaveDev Apr 29 '10 at 12:49
  • Well, glad to know that it worked even though my memories of ASPX are so rusty! :D – NeXuS May 12 '10 at 04:59
4

try this one

 public partial class PerformanceFactsheet : FactsheetBase
{
    public PerformanceFactsheet()
    {
        this.Load += new EventHandler(this.Page_Load);
    }

    protected void Page_Load(object sender, EventArgs e)
    {            
        divPerformance.Controls.Add(this.Data);
    }
}

public abstract class FactsheetBase : System.Web.UI.Page
{
    public MyPageData Data { get; set; }
    public FactsheetBase()
    {
        this.Load += new EventHandler(this.Page_Load);
    }

    new protected void Page_Load(object sender, EventArgs e)
    {            
        this.Data = ExtractPageData(Request.QueryString["data"]);
    }
}
serkanh
  • 41
  • 2
0

try this one:

     public partial class PerformanceFactsheet : FactsheetBase
{
    protected override void Page_Load(object sender, EventArgs e)
    {
base.Page_Load(sender, e);
        // do stuff with the data extracted in FactsheetBase
        divPerformance.Controls.Add(this.Data);
    }
}

public class FactsheetBase : System.Web.UI.Page
{
    public MyPageData Data { get; set; } 
    protected virtual void Page_Load(object sender, EventArgs e)
    {
        // get data that's common to all implementors of FactsheetBase
        // and store the values in FactsheetBase's properties
        this.Data = ExtractPageData(Request.QueryString["data"]);            
    }
}
kav
  • 1
0

Make the page load public, and call it in a manner like this from the other page:

this.myPageOrUserControl.Page_Load(null, EventArgs.Empty);
Tyler S. Loeper
  • 816
  • 11
  • 22