全国统一热线:
028-86758058
18980748058
购买流程
付款方式
常见问题
在线提问
续租服务
购物车(
0
件)
用户名:
密 码:
记住
首 页
HOME
域名注册
DOMAIN
虚拟主机
WEB HOST
成品网站超市
AUTO Site
VPS主机
VPS SERVER
云 主 机
CLOUD HOST
租用托管
SERVER
海外主机
HK HOST
代理专区
AGENT
客服中心
SERVICE
站长教程
SERVICE
欢迎光临西部数据云计算中心,我们将竭诚为您提供最优质的服务!
中文域名
域名转入
域名转出
DNS管理
动态域名
获取域名证书
域名停放
域名过户
集群主机
双线主机
基本主机
港台主机
论坛主机
Linux主机
Vip合租主机
超G型主机
ASP.net主机
Java主机
智能建站主机
网店主机
美国主机
数据库
成品网站超市
智能建站主机
集群VPS主机
国内VPS主机
香港VPS主机
美国VPS主机
云主机介绍
云主机购买
服务器租用
主机托管
常见问题
香港主机
港台主机
美国主机
国内免备案
步骤流程
代理级别
代理合同
代理模式
代理优势
在线申请
产品列表
常见问题
代理商分布图
常见问题
有问必答
跟踪提问
购买流程
产品价格
付款方式
常用软件
网站备案
续租服务
汇款确认
相关文档
联系我们
域名资讯
主机资讯
行业动态
网页制作
php教程
mysql教程
域名资讯
云计算资讯
网络编程
您当前的位置:
首页
>
网络编程
>
Net教程
asp.net viewstate 回发机制
时间:2015-01-29 来源:互联网 作者:佚名
所谓回发机制,其实说白了就是自己发送给自己(本页面)而已。下面我们新建一个网站,打开默认添加的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控件开发》让我获益良多。
asp.net 去除viewstate
来顶一下
返回首页
推荐资讯
asp.net Web Service 接口大量数据
具体请看下面的流程图及其说明 1,流程图2,流程说明:线程1
C#通过POP3获取邮件的代码(正文和附
使用方法: 获取第1封邮件 复制代码 代码如下: Zgke.Net.POP3
相关文章
asp.net 删除MFC单文档默认菜单栏的两种方法
asp.net GridView中超链接的使用(带参数)
asp.net(C#)生成无限级别菜单
asp.net 获取Datalist中Checkbox的值的小结
asp.net 页面回跳实现代码
asp.net下Repeater使用 AspNetPager分页控件
asp.net Web Service 接口大量数据传输解决方案
asp.net Repeater 数据绑定代码
ASP.NET中MD5与SHA1加密的几种方法
ASP.NET编程时遇到GridView的一个问题 激发了未处理的
栏目更新
栏目热门
返回首页
关于我们
联系我们
付款方式
价格总览
资讯中心
友情链接
媒体关注
有问必答
投诉建议
网站备案
《中华人民共和国增值电信业务经营许可证》编号:川B2-20080058号
官方网址:
xibushuju.com
西部数据
Copyright © 2002~2015
天府快车
版权所有
电话总机:
028-86758058
(50线) 传真:
028-86758058