How to Execute Page_Load() in Page's Base Class?
Asked Answered
J

6

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

Jassy answered 29/4, 2010 at 12:4 Comment(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 <configuration>\<system.web>\<httpModules> section in the application configuration.Selfpity
E
55

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);
    }
}
Escalator answered 29/4, 2010 at 12:9 Comment(4)
Why do you say overriding OnLoad is less preferred?Roby
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.Escalator
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.Roby
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 sameDamn
I
7

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

Index answered 29/4, 2010 at 12:9 Comment(0)
O
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).

Onwards answered 29/4, 2010 at 12:13 Comment(3)
this will not compile. It will need to be called as base.OnLoad(e);Escalator
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 implementorJassy
Well, glad to know that it worked even though my memories of ASPX are so rusty! :DOnwards
C
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"]);
    }
}
Condole answered 24/10, 2012 at 9:13 Comment(0)
S
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"]);            
    }
}
Subcutaneous answered 19/3, 2015 at 16:15 Comment(0)
B
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);
Bacchant answered 15/6, 2018 at 15:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.