2010-04-29 7 views
27

Tôi có PerformanceFactsheet.aspx.cs lớp trang sauLàm thế nào để thực hiện Page_Load() trong lớp cơ sở của trang?

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

nơi FactsheetBase được định nghĩa là

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

Vấn đề là Page_Load FactsheetBase đang không thực hiện.

Có ai cho tôi biết tôi đang làm gì sai không? Có cách nào tốt hơn để có được kết quả sau tôi không?

Cảm ơn

+0

Đối với các công cụ tìm kiếm: Tôi sử dụng Q & A để cuối cùng giải quyết một vấn đề với truy cập vào phiên qua một constructor trong lớp cơ sở của tôi, mà đã đưa ra ngoại lệ sau: 'Trạng thái phiên chỉ có thể được sử dụng khi enableSessionState được đặt thành true, hoặc trong tệp cấu hình hoặc trong chỉ thị Trang. Cũng vui lòng đảm bảo rằng System.Web.SessionStateModule hoặc mô-đun trạng thái phiên tùy chỉnh được bao gồm trong phần \ \ trong cấu hình ứng dụng.' – sfuqua

Trả lời

45

Chúng tôi phải đối mặt với vấn đề tương tự, tất cả các bạn cần làm chỉ là đăng ký xử lý trong hàm tạo. :)

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

cách tiếp cận khác sẽ được override onload() là phương pháp ít được ưu tiên.

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

Tại sao bạn nói ghi đè 'OnLoad' ít được ưu tiên hơn? –

+3

vì trong phương pháp đó bạn có thể quên gọi base.OnLoad (e) sẽ ảnh hưởng đến đối tượng Trang bất lợi. Và sự kiện Load cũng được hiển thị trên đối tượng Page trên đó bạn có thể đăng ký nhiều như handler mà bạn muốn, theo cách này bạn không chanigng bất cứ thứ gì đã tồn tại nhưng thêm handler của riêng bạn vào event. –

+10

Tôi đồng ý rằng * quên gọi base.OnLoad (e) * ít được ưu tiên hơn, nhưng đáng lưu ý rằng việc ghi đè 'OnLoad' cho phép bạn kiểm soát khi mã của bạn được thực thi - bạn có thể nói bạn muốn mã của mình đi trước hay sau khi các trình xử lý 'Load' khác. Điều này có lẽ không quan trọng lắm, nhưng nó ** khác **, không tệ hơn hoặc tốt hơn là thêm một trình xử lý khác. –

6

Thay vì một phương pháp Page_Load(), ghi đè onload() và gọi base.OnLoad() trong PerformanceFactsheet

3

Uhm, tôi có thể sai, nhưng tôi tin rằng điều này là do thừa kế: bạn đang ghi đè phương thức FactsheetBase Page_Load trong lớp dẫn xuất.

Để có nó được thực hiện, bạn nên làm điều gì đó như

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 chắc chắn cho bạn một giải pháp sạch hơn (Tôi không phải là một lập trình viên ASPX).

+0

điều này sẽ không biên dịch. Nó sẽ cần phải được gọi là base.OnLoad (e); –

+0

Tôi đã cố gắng này ra @curious_geek & nó làm việc cho tôi.Tôi đã quyết định chấp nhận câu trả lời của bạn là chính xác mặc dù vì câu trả lời của NeXuS yêu cầu tôi có 'base.Page_Load (người gửi, e); 'trong mọi người triển khai – DaveDev

+0

Vâng, vui mừng khi biết rằng nó hoạt động ngay cả khi những ký ức của tôi về ASPX rất bị gỉ !: D – NeXuS

3

thử này một

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

thử này một:

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