ViewState和客户端更改

时间:2010-06-29 11:09:42

标签: c# asp.net javascript postback viewstate

我注意到一些控件(例如TextBox)在回发之间保持更改,即使更改是由客户端脚本进行的,而其他一些则没有(例如ListBox)。谁能解释我为什么?有没有办法将第一个行为扩展到其他控件? 谢谢!

2 个答案:

答案 0 :(得分:1)

这取决于ListBox何时被数据绑定或正在填充ListItem。

通常,当在另一个父控件(如Repeater)中创建ListBox并且Repeater在Page_Load事件中受数据绑定时,会发生这种情况。这意味着在Page_Load事件结束之前,ListBox实际上不存在。

ViewState将在页面控件的Page_Init和Page_Load事件之间的某处恢复到ListBox。如果在Load事件期间创建了ListBox的内容,这意味着ListBox的ViewState无法在PostBack之后恢复内容,并且无法跟踪并自动从PostBack中选择新的SelectedValue。

如果此情况下的Repeater在Page_Init事件中是数据绑定的,则在Page_Init事件和ViewState能够正确恢复并自动选择SelectedValue之后,ListBox的内容将准备就绪。

我通常会在Page_Init事件中对所有内容进行数据绑定,以确保控件能够正确使用ViewState。

有关详细信息,请查看ASP.NET Web表单的页面生命周期。

http://msdn.microsoft.com/en-us/library/ms178472.aspx

答案 1 :(得分:0)

所有控件都会在回发之间保持更改 - 除非您以编程方式再次创建它们。

可能你的ListBox会丢失更改,因为你在每个PostBack上填充它。

尝试

if(!IsPostBack)
{
 PopulateMyListBox()
}