簡體   English   中英

在Load事件中使用LoadControl的陷阱

[英]Pitfalls of using LoadControl in the Load event

我在Load事件中廣泛使用LoadControl方法。 但是我還沒有觀察到任何問題,我擔心MSDN文檔說了些什么:

當您將控件加載到容器控件中時,容器會引發所有添加的控件的事件,直到它趕上了當前事件為止。 但是,添加的控件無法趕上回發數據處理 為了使添加的控件參與回發數據處理(包括驗證),必須在Init事件中而不是Load事件中添加該控件。

這到底是什么意思?

在Load事件中加載控件時,還有其他陷阱嗎?

MSDN文檔的那部分(大部分)是錯誤的。 正如您所發現的,即使您在Load事件中動態添加控件,回發數據處理和驗證也可以工作。

以下是與此問題相關的ASP.NET頁面生命周期的各個階段:

  1. 引發Init事件。
  2. 回發:加載視圖狀態和控件狀態。
  3. 回發:加載已發布的表單數據(首次嘗試)。
  4. 引發Load事件。
  5. 回發:加載已發布的表單數據(第二次嘗試)。
  6. 回發:驗證表單並引發回發事件。

當文檔說“添加的控件未趕上回發數據處理”時,該文檔是正確的。 但是它忽略了以下事實:有兩次嘗試加載過帳的表單數據,一次是在Load事件之前,一次是在事件之后。 因此,如果在Load事件中動態添加控件,則在發生回發事件(例如submitButton_Click )時, 使用發布的表單數據填充該submitButton_Click

據我所知,這是主要的區別和潛在的陷阱:

  • 如果您在Init動態添加控件,則可以在Load訪問其發布的表單數據。
  • 如果在Load動態添加控件,則必須等到回發事件(否則直接訪問HttpRequest.Form集合)。

這意味着在Control_Load執行時,回發周期已經過去和消失。 如果您有一個需要參與回發的控件,則需要在之前加載它,因此這就是文檔建議改為在Init覆蓋中進行的原因。

如果您的控件不參與回發,那么您就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM