gpt4 book ai didi

asp.net - 为什么 DropDownList.SelectedValue 依赖于 viewstate?

转载 作者:行者123 更新时间:2023-12-01 15:43:27 25 4
gpt4 key购买 nike

如果我在我的页面上设置:EnableViewState="true" ViewStateMode="Disabled" - 然后 - 页面的 Viewstate 被禁用(除非覆盖...)

然后,尝试读取(假设控件已在最后一次转储中填充到屏幕并选择了一个值):
MyDDL.SelectedValue将产生 ""
那是因为禁用了 viewstate :

但我的问题是更高层次的:

  • 如果这完全是关于一个表单值(我仍然可以从 Request.Form[MyDDL.UniqueID] 获得) - 我们正在谈论一个不需要任何东西来保存其值的输入。
  • 为什么 DropDownList名为 (SelectedValue) 的属性依赖于 ViewState 吗?

  • p.s.文本框 更改事件 尽管控件是输入(不需要 View 状态),但确实依赖于 View 状态 - 它保存文本的值,然后在回发时进行比较。但它仅在您设置 onchange 事件(和自动回发)时依赖于 View 状态

    最佳答案

    SelectedValue依赖 ViewState因为在 PostBack 上它会重建它的 ListItems来自 ViewState然后在 DropDownList 上设置所选值来自 Request目的。

    它没有占用Request值为SelectedValue直接地。这又是因为,ASP.Net 可以检查是否发布了 DropDownList在客户端没有被篡改。它首先反序列化 ViewState 中的原始项目。 .然后它会找到 Request项目中的值并设置其Selected属性为 true .只有现在,SelectedValue属性可用。 (或 SelectedIndex 就此而言)。它应该能够触发 SelectedIndexChanged现在事件。

    这也是不需要绑定(bind)DropDownList的原因。再次在 PageLoad .列表项自动从 ViewState 中检索。 .

    如果 ViewState被禁用,则 ViewState 中将没有原始列表项并将为空。因此,它将无法将任何项目标记为选中。因此 SelectedValue将为 0 或 SelectedItem将为空。我认为 SelectedIndexChanged事件也不会触发。为了在这种情况下工作,需要完成数据绑定(bind),最好是在 init 上。 .

    但是,有一些解决方法。

    完整引用:http://msdn.microsoft.com/en-us/library/ms972976.aspx

    编辑 :(在 Op 的评论之后)

    跟随页面生命周期查看SelectedValue依赖 ViewState :

    阶段 1 初始化:构建控制层次结构。如果 DropDownList 在此处绑定(bind)或已以声明方式添加 ListItems,则在此处填充 List。

    第 2 阶段加载 ViewState:在 PostBack 上,此处验证 ViewState 并将其加载到 DropDownList 中。有没有 SelectedValue这里。

    第 3 阶段加载回发数据:这里是 Request取值(来自表单请求),然后应用于控件。在这种情况下 DropDownList现在 SelectedValue来自收到的Request对象值,内部实现是这样的:

    string selectedValue = HttpContext.Current.Request.Form[DropDownList_Id];
    Items.FindByValue(selectedValue).Selected = true;

    这里重要的是,如果 ViewState 不存在且 DropDownList 未绑定(bind)数据,则 ListItem 集合将为空,因此 SelectedValue属性为0。这与属性的内部实现无关。

    如果 ViewState 不存在(禁用)并且 DropDownList 是数据绑定(bind)的,则 ListItem 集合将存在并且相应的项目将被标记为选中,因此 SelectedValue属性将返回正确的值。

    如果项目集合是新的(通过重新绑定(bind)不同的数据集或 ViewState 无效),则 Request在项目集合中找不到表单值,再次 SelectedValue将无效。

    第 4 阶段页面加载:此时 ViewState(或数据绑定(bind))和 PostBack 数据已经加载。

    第 5 阶段提出回发事件:在此阶段 OnSelectedIndexChanged如果在第 3 阶段更改了索引,则会触发 DropDownList 事件。

    因此, SelectedValue在第 3 阶段依赖于 ViewState。当然,如果控件是适当的数据绑定(bind),那么它就不会依赖 ViewState 作为推论。
    SelectedValue依赖 ViewState 来确保在设置之前已填充项目集合。数据绑定(bind)/重新绑定(bind)只是确保填充项目集合的另一种方法。

    希望澄清。

    关于asp.net - 为什么 DropDownList.SelectedValue 依赖于 viewstate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18077686/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com