在每一個 ASP.NET 專案中通常都會用到好多 DropDownList 控制項,不過我想很多人不會特別注意到 DropDownList 會產生多少 ViewState,預設來說 DropDownList 控制項會將所有選項 ( ListItem ) 的資料都先儲存到 ViewState 中,以利如果選項很多的話就很有可能導致 ViewState 突然變很大,不但讓網頁下載回應速度變慢,也浪費網路頻寬。
一般來說,我們會用 DropDownList 控制項搭配 DataSource 控制項將資料取出,或是在 Page_Load 事件將資料載入 DropDownList 控制項,例如說:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindCountryList();
}
}
private void BindCountryList()
{
ddlCountry.DataSource = SiteHelper.GetCountryList();
ddlCountry.DataBind();
}
不過這樣 ViewState 會產生一大堆,如果要徹底降低 ViewState 的資料量,就可以用以下的技巧將 ViewState 消除。
首先,需在 DropDownList 控制項宣告一個 OnInit 事件 ( 一定要是 OnInit 事件 )
<asp:DropDownList runat="server" ID="ddlCountry" OnInit="ddlCountry_Init">
接著實作 ddlCountry_Init 事件:
protected void ddlCountry_Init(object sender, EventArgs e)
{
ddlCountry.DataSource = SiteHelper.GetCountryList();
ddlCountry.DataBind();
}
只要這樣子設計你的 DropDownList 就可以將原本 DropDownList 控制項會產生的 ViewState 全部去除掉,同樣的技巧一樣可以運用在任何其他的 List 控制項(如:ListBox, CheckBoxList, RadioButtonList, ... ),是不是簡單又實用呢。
你也可以將專案中常用的 DropDownList 寫成 Custom WebControl,只要繼承 DropDownList 控制項並覆寫(overwrite) OnInit 事件,並在該事件內將資料載入即可。