在ASP.NET中,如果我重寫頁面生命週期事件,我應該在做我的工作之前還是之後調用其基本方法?它甚至重要嗎?我應該在什麼時候調用ASP.NET事件的基本方法?
protected override void OnPreRender(EventArgs e)
{
// My code goes here
base.OnPreRender(e);
// Or here
}
在ASP.NET中,如果我重寫頁面生命週期事件,我應該在做我的工作之前還是之後調用其基本方法?它甚至重要嗎?我應該在什麼時候調用ASP.NET事件的基本方法?
protected override void OnPreRender(EventArgs e)
{
// My code goes here
base.OnPreRender(e);
// Or here
}
是的,你應該照顧。假設您需要在所有這些頁面中插入一個新的基類。對我來說,繼續調用基本方法比稍後進行大量重構更容易。
然後,也許你不需要那樣做。
編輯
基於編輯的問題這裏多一些信息:
是的,你應該關心。有時你希望基類方法在你的之前觸發(在構造函數的情況下),有時你希望它在你的(析構函數)之後觸發。
這可能意味着在您的代碼到達時,屬性或對象是否可用。
asp.net事件模型中的「OnEvent」方法僅包含實際的事件調用(在本例中爲「PreRender」事件)。所以你唯一需要決定的是「我需要在我工作之前還是之後打電話給我」?
我認爲這是一個好主意,只是原則上打電話給他們。在目前使用的框架版本中,基類方法中沒有代碼,但誰知道未來版本可能是事實。另外,關注的分離將決定你從Page派生的代碼不會假設Page類沒有做任何事情,而是在其OnPreRender方法中引發PreRender事件。
-1:「可能是這樣的......基類方法中沒有代碼」。不,OnXxx基本方法會觸發相應的事件,並且您不能假定沒有人會處理該事件。 – Joe 2009-02-13 21:02:16
沒有單一規則。我可以給你提供一個例子。我的ASP.net webapp使用由母版頁打開並在頁面結束時由它提交/回滾的NHibernate事務。那麼,我必須儘早在OnInit方法中初始化事務(Master沒有像頁面這樣的OnPreInit),否則用戶控件在Page.Load之前不能訪問事務。
同樣的規則適用於提交。控件可能希望在其生命週期的最後階段更新對象,然後我必須在Unload方法中儘可能最新地關閉事務,甚至在處理程序中關閉事務!
所以......在我的情況...
void OnInit(EventArgs e) {
transaction = session.BeginTransaction();
base.OnInit(e);
}
void OnUnload(EventArgs e) {
base.OnUnload(e);
try{
transaction.Commit();
} catch {}
}
void OnError(EventArgs e) {
base.OnError();
transaction.Rollback();
}
我建議你一個一般的規則:如果你的頁面的設計合同涉及創建和銷燬資源一定的事件之間使用的控件(即。加載後的PreRender之前),初始化儘早最後事件被觸發
如果你要調用的頁面後,資源儘可能晚地之前的事件被觸發,並摧毀它基礎方法,無論如何,你可以使用
protected void Page_PreRender (object sender, EventArgs e) {...}
而不是
protected override void OnPreRender(EventArgs e) {
base.OnPreRender(e);
...
}
答案是,這取決於什麼代碼做什麼,這就是如果它應該去之前或之後。
正如另一個說,如果它是構造函數的東西它應該去之前。析構函數應該去。舉一個更具體的例子,如果你有處理頁面和加載內容的代碼,填充下拉列表,並填充標籤等,那麼你會希望在任何代碼看到什麼是預填充和確定可見性或業務規則邏輯與該頁面上的數據有關。
通常的答案是「沒關係」 – 2009-02-13 19:49:55