Как выполнить Page_Load () в базовом классе страницы? - PullRequest
30 голосов
/ 29 апреля 2010

У меня есть следующий класс страницы PerformanceFactsheet.aspx.cs

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);
    }
}

, где FactsheetBase определено как

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"]);            
    }
}

Проблема в том, что Page_Load FactsheetBase не выполняется.

Может кто-нибудь сказать мне, что я делаю не так? Есть ли лучший способ получить результат, к которому я стремлюсь?

Спасибо

Ответы [ 6 ]

49 голосов
/ 29 апреля 2010

Мы столкнулись с подобной проблемой, все, что вам нужно сделать, это просто зарегистрировать обработчик в конструкторе. :)

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"]);             
    } 
}

Другим подходом было бы переопределить OnLoad () , который менее предпочтителен.

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);
    }
}
7 голосов
/ 29 апреля 2010

Вместо метода Page_Load () переопределите OnLoad () и вызовите base.OnLoad () в PerformanceFactsheet

4 голосов
/ 24 октября 2012

попробуйте это

 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"]);
    }
}
4 голосов
/ 29 апреля 2010

Хм, возможно я ошибаюсь, но я полагаю, что это связано с наследованием: вы перезаписываете метод FactsheetBase Page_Load в производном классе.

Чтобы его выполнить, вы должны сделать что-то вроде

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);
    }
}

РЕДАКТИРОВАТЬ: n8wrl определенно дал вам более чистое решение (я не программист ASPX).

0 голосов
/ 15 июня 2018

Сделайте загрузку страницы общедоступной и вызовите ее так, как показано на другой странице:

this.myPageOrUserControl.Page_Load(null, EventArgs.Empty);
0 голосов
/ 19 марта 2015

попробуйте это:

     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"]);            
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...