﻿# 控制 DropDownList 產生的 ViewState 資料量

在每一個 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 事件，並在該事件內將資料載入即可。
