The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

控制 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 事件,並在該事件內將資料載入即可。