跨回发的控制值持久性

本文关键字:持久性 控制 | 更新日期: 2023-09-27 18:01:47

给出下面的代码,有没有人能解释下拉列表到底是如何在回发中记住它所选择的值的,假设viewstate是禁用的,并且在viewstate完成跟踪值之后才构造控件。

DropDownList ddl;
protected void Page_Load(object sender, EventArgs e)
{
    ddl = new DropDownList() {AutoPostBack = true, EnableViewState = false, ViewStateMode = ViewStateMode.Disabled };
    ddl.Items.Add(new ListItem("1"));
    ddl.Items.Add(new ListItem("2"));
    div.Controls.Add(ddl);
}

跨回发的控制值持久性

控件使用ControlState,它与ViewState分开。但在实现上相似。

ControlState与ViewState

Viewstate不用于保留发送到服务器的值。它可以用来保留上次在viewstate中为客户端提供服务时所选择的值,但这只是为了生成服务器端事件,例如selectedindexchanged。但是,它的当前值取决于控件向服务器发布的内容。DropDownList实现了IPostBackDataHandler,它"定义了ASP。. NET服务器控件必须实现才能自动加载回发数据。"

同样,DropDownList的当前值不是从ViewState中检索的,而是从提交的表单值中检索的。如果您不需要它来维持它的值,那么在将它添加到控制树之后,将它所选择的索引设置为0(或者其他默认索引)。这一点很重要,你在添加后再做,否则张贴的值将在你添加到控件树时被加载。