【发布时间】:2010-06-29 11:09:42
【问题描述】:
我注意到一些控件(例如 TextBox)在回发之间保留它们的更改,即使更改是由客户端脚本进行的,而另一些则没有(例如 ListBox)。谁能解释我为什么?有没有办法将第一个行为扩展到其他控件? 谢谢!
【问题讨论】:
-
这些不变的文本框是否被标记为
ReadOnly?
标签: c# asp.net javascript postback viewstate
我注意到一些控件(例如 TextBox)在回发之间保留它们的更改,即使更改是由客户端脚本进行的,而另一些则没有(例如 ListBox)。谁能解释我为什么?有没有办法将第一个行为扩展到其他控件? 谢谢!
【问题讨论】:
ReadOnly?
标签: c# asp.net javascript postback viewstate
这取决于何时对 ListBox 进行数据绑定或填充 ListItem。
一般情况下,当 ListBox 在另一个父控件(如 Repeater)中创建,并且 Repeater 在 Page_Load 事件中是数据绑定时,就会发生这种情况。这意味着 ListBox 在 Page_Load 事件结束之前实际上并不存在。
ViewState 恢复到 ListBox 中的 Page_Init 和 Page_Load 事件之间的页面控件。如果 ListBox 的内容是在 Load 事件期间创建的,则意味着 ListBox 的 ViewState 在 PostBack 之后无法恢复内容,无法跟踪并自动从 PostBack 中选择新的 SelectedValue。
如果在这种情况下,Repeater 在 Page_Init 事件中是数据绑定的,则 ListBox 的内容将在 Page_Init 事件之后准备好,并且 ViewState 能够正确恢复并自动选择 SelectedValue。
我通常在 Page_Init 事件中对所有内容进行数据绑定,以确保控件能够正确使用 ViewState。
查看 ASP.NET Web 表单的页面生命周期了解更多详情。
【讨论】:
所有控件在回发之间保持其更改 - 除非您以编程方式再次创建它们。
您的 ListBox 可能会丢失更改,因为您在每个 PostBack 上填充它。
试着去做
if(!IsPostBack)
{
PopulateMyListBox()
}
【讨论】: