4
votes

The default.aspx page has a DropDownList which is populated in the code behind only when it is not a postback. When a value is selected a method is called which fills a Literal with the selected value. It works as expected. The problem is when I set the page to not EnableViewState enabling it in the DropDownList control only. In this case when posted back the DropDownList loses its items. I have setup a new Web project just to test this. There is no master page to make it simpler.

Default.aspx:

<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="WebApplication4._Default" 
    EnableViewState="false" %>

<asp:DropDownList ID="DDL" runat="server" 
    OnSelectedIndexChanged="DDL_OSIC" 
    AutoPostBack="true" 
    EnableViewState="true">
</asp:DropDownList>

<asp:Literal ID="Literal1" runat="server"></asp:Literal>

Default.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        DDL.Items.Add("red");
        DDL.Items.Add("green");
        DDL.Items.Add("blue");
    }
}
protected void DDL_OSIC(object sender, EventArgs e)
{
    Literal1.Text = DDL.SelectedValue;
}

Why isn't EnableViewState working?

2

2 Answers

4
votes

Found the answer with the help of a deleted answer. The deleted answer was wrong just because it was incomplete. With that hint I found the ViewStateMode Property page.

Summarizing it to disable all controls' ViewState and enable it just for the choosen ones:

  • Set both the page and all the control's EnableViewState property to true. This is the default so it is not necessary to write anything
  • Set the page ViewStateMode to Disabled
  • Set ViewStateMode to Enabled in the control where you want ViewState enabled
-3
votes

In my computer,I create a web application.The result is same with you. I guess,when the page viewstate is false,control viewstate can't work.