views:

277

answers:

3

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

+1  A: 

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

n8wrl
+3  A: 

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
Why do you say overriding `OnLoad` is less preferred?
Jeff Sternal
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
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
A: 

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
this will not compile. It will need to be called as base.OnLoad(e);
this. __curious_geek
I tried this out @curious_geek ` in every implementor
DaveDev
Well, glad to know that it worked even though my memories of ASPX are so rusty! :D
NeXuS