一个容易误解的小问题:TextBox的EnableViewState为false为什么无效

来源:互联网 发布:linux文件夹列表 编辑:程序博客网 时间:2024/05/22 02:25
    Page对象的EnableViewState属性为false,意味着整个页面(包括其中的所有服务器端控件)的ViewState被禁用,但是<input type="hidden" name="__VIEWSTATE" value="...." />并不消失,这个时候ViewState是不起作用的。

    TextBox的文本内容会放置在Post到服务器的数据集合里面,然后TextBox实现了IPostBackDataHandler接口,它会在Page_Load事件之前调用IPostBackDataHandler.LoadPostData 方法来根据Post回来的Html元素的name属性与服务器端控件的UniqueID属性相匹配来更新响应TextBox.Text属性,然后,如果这个新的数据与老的Text属性不一样了,则LoadPostData返回true,这样后面的RaisePostDataChangedEvent将会被调用,这个事件最后会调用OnTextChanged方法触发TextBox.TextChanged事件,然后,最后在Render事件里面,TextBox将会将其Text属性Render出来,这样,最终显示的TextBox内容还是会保持。(注意,这里UniqueID属性非常重要,一定要在Render的时候将name属性设置为UniqueID,否则LoadPostData方法将不能够找到正确的服务器端控件匹配,具体参考最后的“Processing Postback Data”)

     注意:虽然TextBox的Text属性是使用ViewState来实现的而此时ViewState被禁用,但是ViewState被禁用只是意味着LoadViewState和SaveViewState方法并不会将服务器内容中的ViewState对象内容保存在<input type="hidden" name="__VIEWSTATE" value="...." />里面,内存中的ViewState对象还是可以使用的,可以证明如下:
private void Page_Load(object sender, System.EventArgs e)
{
 this.ViewState["test"]="test";
 this.Response.Write(this.ViewState["test"].ToString());
}

在ViewState被禁用的情况下,"test"字符串还是会被写出来的,这说明内存中的ViewState对象还是可以使用的。

关于服务器端控件对于Post回来数据的详细信息,请参考:“Control Execution Lifecycle”
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcontrolexecutionlifecycle.asp

“Processing Postback Data”
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconreceivingpostbackdatachangednotifications.asp

下面这篇文章讲述了模拟TextBox的详细实现源代码:
“Postback Data Processing Sample”
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconpostbackdataprocessingsample.asp