viewstate

  ASP.NET中,为了模拟Winform中的事件响应机制,微软的工程师真是煞费苦心,发明了“回发”机制,使得编写WEB页面变得和Winform一样简单。所谓回发机制,其实说白了就是自己发送给自己(本页面)而已。下面我们新建一个网站,打开默认添加的Default.aspx页面,form部分代码如下:

 

1  < form id = " form1 "  runat = " server "   >
2  < div >
3 
4  </ div >
5  </ form >

 

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

 

1  < form name = " form1 "  method = " post "  action = " Default.aspx "  id = " form1 " >
2       < div >
3       < input type = " hidden "  name = " __VIEWSTATE "  id = " __VIEWSTATE "  value = " /wEPDwUJNzgzNDMwNTMzZGSWiVUOl9W4QUXb+tXv2k5s4yXFog== "   />
4       </ div >
5 
6       < div >
7 
8       </ div >
9  </ 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代码如下:

1  < form id = " form1 "  runat = " server "   >
2  < div >
3        < asp:Label ID = " Label1 "  runat = " server "  Text = " Label " ></ asp:Label >< br  />
4        < asp:TextBox ID = " TextBox1 "  runat = " server " ></ asp:TextBox >< br  />
5        < asp:Button ID = " Button1 "  runat = " server "  Text = " Button "  onclick="Button1_Click" />
6  </ div >
7  </ form >

 

  然后在Button1_Click中写如下代码:

 

1  protected   void  Button1_Click( object  sender, EventArgs e)
2  {
3      Label1.Text  +=   " 你好 " ;
4      TextBox1.Text  +=   " 你好 " ;
5  }

 

  好了,现在我们来给Button1增加一些点击量,可以看到,Label控件和TextBox控件随着我们点击量的提高,其内容也在不断的变化,这种情况在Winform中非常常见,也很容易理解,可是ASP.NET是基于HTTP协议的,而HTTP协议是无状态协议。也就是说,服务器有健忘症,明明不久前刚刚给他发出过请求,创建了一个page对象,并做出响应。但是第二次请求到达的时候,服务器已经不认识你了(服务器会创建一个全新的page对象,和之前那个没有任何关系,再次给出响应)。在这种服务器有健忘症的恶劣条件下,要达到Winform一样的效果,真不是一件简单的事情。

  我们给预编译指令Page增加一个属性EnableViewState="false"(禁用ViewState)之后,再重新运行页面,继续连续点击Button1,看这下是什么效果?大家会发现Label控件效果没有变化,但是TextBox控件内容却还在继续发生着变化。这是什么原因呢?其实我们只要查看一下源代码就会发现:

 

1  < div >
2       < span id = " Span1 " > Label </ span >< br  />
3       < input name = " TextBox1 "  type = " text "  id = " Text1 "   />< br  />
4       < input type = " submit "  name = " Button1 "  value = " Button "  id = " Submit1 "   />
5  </ 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标签原来的内容了。

 

转自:http://www.cnblogs.com/xlb2000/archive/2010/03/27/1698130.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值