即使DropDownList禁用了viestate,SelectedValue仍应返回一个值

Sou*_*ceC 8 c# asp.net viewstate

我想我很了解ViewState,但以下是给我一些麻烦:

来自http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/truly-understanding-viewstate.aspx

即使ViewState被禁用,回发控件(如下拉列表和文本框)也会恢复其发布状态(下拉列表的选定项目已被'发布'),因为即使禁用了ViewState,控件仍然可以发布其值


假设DropDownListEnableViewState设置为false,那么(根据上面的引用)当用户通过选择DropDownList中的项目发出回发时,以下代码应该导致Label1.Text显示所选项目的值(因此DropDownList.SelectedValue应该返回用户选择的值,即使viewstate被禁用),但我得到一个空字符串:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string[] number = {"first","second","third"};
        DropDownList1.DataSource = number;
        this.DataBind();

    }
    if (IsPostBack)
    {
       Label1.Text = DropDownList1.SelectedValue; // displays empty string
       // Label1.Text = DropDownList1.SelectedItem.Text; // causes an exception           
       // Label1.Text = DropDownList1.SelectedIndex.ToString(); // displays empty string
    }
}
Run Code Online (Sandbox Code Playgroud)


该文章的作者似乎是这方面的专家,所以我假设我做错了什么!?!


感谢名单

wom*_*omp 17

没有选定的值,因为:

1)下拉列表中没有项目,因为您只是第一次将数据绑定到它.通常这是一种很好的做法,但是当您关闭ViewState时,您必须每次都为控件显式重新创建数据.

2)您正在页面生命周期中将请求字典值应用于控件的点之后(即,在将ViewState恢复到控件期间)绑定数据.已发布的值存在于Request字典中,但由于没有项目在下拉列表中,它无法真正做到这一点.即使ViewState已关闭,您的作者也是正确的 - 将在生命周期中通常应用ViewState的点处应用已发布的值.

如果您要在Init()中为列表重新创建数据,那么将填充下拉列表以显示要应用的已发布值,将应用该下拉列表,并且在您到达时,所选值将可用加载().希望这很清楚.一些工作代码如下:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            Label1.Text = DropDownList1.SelectedValue;
        }
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        string[] number = { "first", "second", "third" };
        DropDownList1.DataSource = number;
        DropDownList1.DataBind();
    }
}
Run Code Online (Sandbox Code Playgroud)