当前位置: 移动技术网 > IT编程>开发语言>.net > asp.net viewstate 回发机制

asp.net viewstate 回发机制

2017年12月12日  | 移动技术网IT编程  | 我要评论

我们结婚了20170304,通天血魔,花都区教育局网

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

<form id="form1" runat="server" >
<div>
</div>
</form>

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

<form name="form1" method="post" action="default.aspx" id="form1">
<div>
<input type="hidden" name="__viewstate" id="__viewstate" value="/wepdwujnzgzndmwntmzzgswivuol9w4quxb+txv2k5s4yxfog==" />
</div>
<div>
</div>
</form>

  我们可以看到原本空荡荡的form表单内变得丰富起来,首先发生变化的就是form表单自身,<form id="form1" runat="server" >被解释成了<form name="form1" method="post" action="default.aspx" id="form1">,自动的给form1这个表单增加了action和method属性,method默认为post,action则指向页面本身。另外一个发生变化的就是form1表单中增加了一个id="__viewstate" 的隐藏域,这就是我们要讨论的viewstate
  我们再举一个例子:这时,我们向页面中添加一个label一个textbox还有一个button代码如下:
复制代码 代码如下:

<form id="form1" runat="server" >
<div>
<asp:label id="label1" runat="server" text="label"></asp:label><br />
<asp:textbox id="textbox1" runat="server"></asp:textbox><br />
<asp:button id="button1" runat="server" text="button" onclick="button1_click"/>
</div>
</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控件内容却还在继续发生着变化。这是什么原因呢?其实我们只要查看一下源代码就会发现:
复制代码 代码如下:

<div>
<span id="span1">label</span><br />
<input name="textbox1" type="text" id="text1" /><br />
<input type="submit" name="button1" value="button" id="submit1" />
</div>

  3个控件分别变成了span,文本框(text)和提交按钮(submit),当我们点击button1时html会将要提交的表单中的所有表单控件的name和value属性用“&”连接成name=value的字符串,然后向action指向的页面,method指定的方式,发送请求。我们可以将<form id="form1" runat="server" >表单的发送方式修改为get(<form id="form1" runat="server" 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控件开发》让我获益良多。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网