SelectedValue
依赖,因为它ViewState
在 PostBack 上重建它ListItems
,ViewState
然后DropDownList
在Request
对象上设置选定的值。
它不直接将Request
值作为SelectedValue
。这反过来又是因为,ASP.Net 可以DropDownList
在客户端检查发布的内容是否未被篡改。它首先从ViewState
. 然后它在项目中找到Request
值并将其Selected
属性设置为true
。只是现在,该SelectedValue
物业是可用的。(或SelectedIndex
就此而言)。它现在应该能够触发一个SelectedIndexChanged
事件。
这也是不需要DropDownList
再次绑定 in的原因PageLoad
。列表项会自动从ViewState
.
如果ViewState
禁用,则 中将没有原始列表项,ViewState
并且将为空。因此,它将无法将任何项目标记为选中。因此SelectedValue
将是 0 或SelectedItem
将是空的。我认为该SelectedIndexChanged
事件也不会触发。为了在这种情况下工作,需要完成数据绑定,最好是在init
.
但是,有一些解决方法。
完整参考:http: //msdn.microsoft.com/en-us/library/ms972976.aspx
编辑:(在 Op 的评论之后)
按照页面生命周期查看SelectedValue
依赖于何处ViewState
:
阶段 1 初始化:构建控制层次结构。如果 DropDownList 在此处绑定或已以声明方式添加 ListItems,则在此处填充 List。
第 2 阶段加载 ViewState:在 PostBack 上,此处验证 ViewState 并将其加载到 DropDownList 中。这里没有 SelectedValue
。
第 3 阶段加载 PostBack 数据:此处获取Request
值(来自表单请求),然后将其应用于控件。在这种情况下,DropDownList
它现在设置从SelectedValue
接收到的Request
对象值,内部实现是这样的:
string selectedValue = HttpContext.Current.Request.Form[DropDownList_Id];
Items.FindByValue(selectedValue).Selected = true;
这里重要的是,如果 ViewState 不存在且 DropDownList 未绑定数据,则 ListItem 集合将为空,因此SelectedValue
属性为 0。这与属性的内部实现无关。
如果 ViewState 不存在(禁用)并且 DropDownList 是数据绑定的,则 ListItem 集合将存在并且相应的项目将被标记为选中,因此SelectedValue
属性将返回正确的值。
如果项目集合是新的(通过重新绑定不同的数据集或 ViewState 无效),则Request
在项目集合中找不到 Form 值,并且再次SelectedValue
无效。
第 4 阶段页面加载:此时 ViewState(或数据绑定)和 PostBack 数据已经加载。
第 5 阶段引发 PostBack 事件:在此阶段,OnSelectedIndexChanged
如果在第 3 阶段更改了索引,则会触发 DropDownList 事件。
因此,SelectedValue
在第 3 阶段依赖 ViewState。当然,如果控件是适当的数据绑定,那么它就不会依赖 ViewState 作为推论。
SelectedValue
依赖 ViewState 来确保在设置之前已填充项目集合。数据绑定/重新绑定只是确保填充项目集合的另一种方法。
希望澄清。