一个容易误解的小问题:TextBox的EnableViewState为false后,为什么点击按钮PostBack,TextBox的内容还是会保持(Persist)?...

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

转载于:https://www.cnblogs.com/jeffreytan/archive/2004/10/08/49891.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值