关于ViewState的疑惑

stg609 2009-02-17 10:02:44
viewstate不是可以用来保存状态的吗?启用控件的EnableViewState=true,那么该控件的值就不会因为刷新页面而丢失,是这样嘛?
如果是这样,那也就是说如果我不启用viewstate,设置控件的enableViewState = false,那刷新页面的时候这个控件值应该会丢失呀。
可是我不管启不启用控件的viewstate,刷新页面后的结果都是一样,控件值仍旧存在。

我实验时就放置了一个textbox和一个button.button的click事件没有具体内容。
然后当我运行这个页面的时候,在textbox里输入了123,单击按钮。不管我是否启用了viewstate,textbox中的值仍旧存在。

感觉是我对viewstate理解有误,请大家指正。
...全文
140 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
可以模拟一下如果你关闭ViewState,回发时ForeColor自然得不到上一次输出时的值了,但是Text其实在第一个设置阶段也无法正确得到上一次输出页面时的Text值,于是此时TextChanged就会在客户端提交的值不是string.Empty的时候就会触发。
  • 打赏
  • 举报
回复
让我们再次用TextBox的ForeColor属性和Text属性做一个对比:

当页面处理结束输出到客户端时(输出的形式类似于<input type="text" style="color:red" value="" />),ViewState中保存着ForeColor的值,然后当你在客户端修改了TextBox的值,并且提交页面时,浏览器也是只是会提交html标签的value属性值,而并不会提交其它值(就算你使用javascript来改变颜色样式也不会直接提交给后台服务器)。于是,对于TextBox的ForeColor属性,就只有“恢复ViewState”这一个动作,也就是恢复了上一次页面输出时后台设置的ForeColor值。

而对Text属性则不然。当页面处理结束输出到客户端时要输出当前的Text属性值到html标签<input type=text>的value属性上。但是当客户端提交到服务器端之时,在“恢复ViewState”给Text属性之后还又将提交的新值(如果与当前Text值不同则)重新覆盖到Text上并且准备触发随后的事件,第一遍处理是由执行ViewState恢复的机制完成的,第二遍处理是由执行IPostbackDataHandler既处理客户端提交值的机制做的。
  • 打赏
  • 举报
回复
我简单描述一下:

当没有ViewState的时候,客户端post到服务器端时也是提交所有html标签的value属性值的,而这个值就被TextBox设置为Text属性。然后,当页面此次回发处理结束,TextBox输出为<input type="text" value="....." />的时候,这个value就又是你刚刚提交来的新值。然后你再次从客户端修改value并提交.....可见这个过程中从TextBox得到提交的Text值根本不需要ViewState。

那么ViewState有什么作用呢?当页面回发处理时,首先向TextBox恢复Text属性的ViewState值,然后才向Text属性写入提交的值。这个ViewState就是上一次页面输出时Text的“前一个”值,而不是本次由客户端提交的新值。这样,Text比较这两个值,如果不同则会触发TextChanged事件。(这个过程实际上是所有webControl都有的功能接口 IPostbackDataHnadler 定义的,TextBox 从它继承来了这个功能的)

TextBox只有Text属性是这样的。也就是说,当asp.net调用TextBox的 IPostbackDataHandler 接口的方法来处理客户端提交的value的时候,TextBox只会将value写到Text属性并判断是否需要过一会(Page_Load阶段处理结束之后)触发TextChanged事件,而并不会去影响TextBox的其它各种属性。
amandag 2009-02-18
  • 打赏
  • 举报
回复
TextBox的Text属性值不存放在视图状态里
  • 打赏
  • 举报
回复
我以前回复过这个问题,参考《请教点关于生命周期的问题。有点犯晕了》。
stg609 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iloveyoubaby 的回复:]
你将textbox的自动回传功能开启,也就是设置为True,在试一试,也许会有不一样的结果
[/Quote]

无法设置postback开启或关闭呀,没有这个选项。只有一个postbackUrl属性
iloveyoubaby 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 stg609 的帖子:]
viewstate不是可以用来保存状态的吗?启用控件的EnableViewState=true,那么该控件的值就不会因为刷新页面而丢失,是这样嘛?
如果是这样,那也就是说如果我不启用viewstate,设置控件的enableViewState = false,那刷新页面的时候这个控件值应该会丢失呀。
可是我不管启不启用控件的viewstate,刷新页面后的结果都是一样,控件值仍旧存在。

我实验时就放置了一个textbox和一个button.button的click事件没有具体内容。
然…
[/Quote]

你将textbox的自动回传功能开启,也就是设置为True,在试一试,也许会有不一样的结果
Lacsky 2009-02-17
  • 打赏
  • 举报
回复
不管你设为True还是False, aspx页面Render成html页面时都有一个隐藏域, 我觉得是不是和这个有关系啊?
关注中!
cppfaq 2009-02-17
  • 打赏
  • 举报
回复
奇怪了,我在08下设置EnableViewState=false不起作用
whslovexyp 2009-02-17
  • 打赏
  • 举报
回复
呵呵,这个问题早就注意到了,不过一直没去究原因
chengxiaorong 2009-02-17
  • 打赏
  • 举报
回复
关注

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧