﻿# ASP.NET 動態載入的控制項一定要注意的事

我只是想再特別提醒一下各位，如果你一定要動態載入控制項的話，一定要注意幾件事：

第一：熟悉 ASP.NET Page Lifecycle 很重要（事件執行的順序）

> 控制項的初始化(Initialize)的動作一定要放在 Page\_Init 事件中！
> 
> 控制項的初始化也包括設定控制項的預設值(Default Value)。
> 
> 千萬不能將設定控制項初始值的程式碼寫在 Page\_Load 事件裡，否則當 PostBack 回來的值會被 Page\_Load 事件中的程式碼蓋掉。
> 
> 動態將控制項加入到 ASP.NET 頁面中「最好」在 Page\_Load 事件中執行，以確保在後續事件中可以取得頁面中所有的控制項。

第二：要特別留心控制項加入的順序

> 動態將控制項加入到 ASP.NET 頁面中時，要特別注意「控制項加入的順序」，順序很重要，只要加入的順序不對就很有可能會在 PostBack 的時候發生 ViewState 異常的狀況，各位可以參考我之前寫的一篇文章：[釐清 ViewState 與動態加入的控制項可能發生的錯誤](/post/2008/01/06/ViewState-and-Dynamic-Controls)

第三：ViewSate 是個低調的怪獸，能不用就不用

> 你知道光是談 ViewState 就可以出一本書嗎！
> 
> 老實說，ViewState 真的很好用，用的人也很多，誤用的人也很多，敗在 ViewState 上面的人也很多。所以一件事情所帶來的好處，背後通常也潛藏著某些不為人知的壞處。我剛學寫 ASP.NET 的時候，曾經寫過一個線上預約系統，因為頁面超複雜，一大堆控制項都是動態加入的，每次 PostBack 大概都要送出 1MB 左右的 ViewState 資料，當初剛學 ASP.NET 也不知道為什麼會這樣，只是覺得為什麼 ASP.NET 執行速度這麼慢，等要結案的時候才發現原來是 ViewState 搞的鬼，光是改另一種寫法就寫死我了。
> 
> 所以我對 ViewState 一直沒什麼好感，後來我的態度是「我一定要徹底瞭解 ViewState，並且在未來的日子裡能不用就不用它」。既然不用又為何要瞭解的？因為如果你不深入瞭解一項技術背後設計的動機與嘗試解決的問題，你就無法從這項技術得到啟發，並發展出另一套更適合自己的開發架構。

短短的三點提醒，一定不足以應用所有的開發情境，所以各位若能貢獻一些動態載入控制項開發時的注意事項，十分歡迎在此留下些評論，互相交流交流。
