栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > asp

asp.net viewstate 回发机制

asp 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

asp.net viewstate 回发机制

所谓回发机制,其实说白了就是自己发送给自己(本页面)而已。下面我们新建一个网站,打开默认添加的Default.aspx页面,form部分代码如下:
复制代码 代码如下:


  下面是运行页面后的HTML代码:
复制代码 代码如下:


  我们可以看到原本空荡荡的form表单内变得丰富起来,首先发生变化的就是form表单自身,

  然后在Button1_Click中写如下代码:
复制代码 代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text += "你好";
TextBox1.Text += "你好";
}

  好了,现在我们来给Button1增加一些点击量,可以看到,Label控件和TextBox控件随着我们点击量的提高,其内容也在不断的变化,这种情况在Winform中非常常见,也很容易理解,可是ASP.NET是基于HTTP协议的,而HTTP协议是无状态协议。也就是说,服务器有健忘症,明明不久前刚刚给他发出过请求,创建了一个page对象,并做出响应。但是第二次请求到达的时候,服务器已经不认识你了(服务器会创建一个全新的page对象,和之前那个没有任何关系,再次给出响应)。在这种服务器有健忘症的恶劣条件下,要达到Winform一样的效果,真不是一件简单的事情。
  我们给预编译指令Page增加一个属性EnableViewState="false"(禁用ViewState)之后,再重新运行页面,继续连续点击Button1,看这下是什么效果?大家会发现Label控件效果没有变化,但是TextBox控件内容却还在继续发生着变化。这是什么原因呢?其实我们只要查看一下源代码就会发现:
复制代码 代码如下:

Label






  3个控件分别变成了span,文本框(text)和提交按钮(submit),当我们点击Button1时HTML会将要提交的表单中的所有表单控件的name和value属性用“&”连接成name=value的字符串,然后向action指向的页面,method指定的方式,发送请求。我们可以将
表单的发送方式修改为get()再点击提交,就可以注意到地址栏的变化了。
  由于Label控件最终生成的标签是span,但是表单在提交时,不会提交span标签中的value,但是却会提交input中的value,所以服务器可以得到input最新的value,而由于没有发送span的value,所以服务器无法得到span最新的修改。这就是为什么当禁用ViewState时,Label不会变化,而input还是会发生变化的原因了。要解决这个问题,asp.net引入了ViewState,其实ViewState就是一个hidden隐藏域而已。表单不会发送span标记的value但是却会发送hidden控件的value,于是asp.net在给span标记赋值的时候,再给这个名叫ViewState的hidden控件记录一份,这样服务器就可以从hidden中获得Label标签原来的内容了。
  这就是ViewState的本质,当然在服务器端还有LoadViewState和SaveViewState方法,夜深了,就不再多说了。这是小弟的第一篇博文,斗胆放入首页,希望大家能够以鼓励为主,拍砖为辅!谢谢谢谢
  还要感谢谭兄,那本《道不远人--深入ASP.NET控件开发》让我获益良多。
asp.net 去除viewstate
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/58792.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号