ViewState机制由浅入深1

1 ViewState机制是什么?

ViewState机制是asp.net中对同一个Page的多次请求(PostBack)之间维持Page及控件状态的一种机制。在WebForm中每次请求完,Page对象都会被释放,对同一个Page的多次请求之间的状态信息,如何进行维护呢?WebForm中,每次请求都会存在客户端和服务器之间的一个交互。如果请求完成之后将一些信息传回到客户端,下次请求的时候客户端再将这些状态信息提交给服务器,服务器端对这些信息使用和处理,再将这些信息传回给客户端。这样是不是就可以对同一个Page的多次请求(PostBack)之间维持状态了。对这就是ViewState的基本工作模式。ViewState的设计目的主要就是为了将必要的信息持久化在页面中。这样通过ViewState在页面回传的过程中保存状态值,使原本没有“记忆”的Http协议变得有“记忆”起来。

2 ViewState机制如何工作?

下面我们看看ViewState机制是如何具体的工作的。

2.1客户端:

我们先从客户端看起,在客户端的HTML源代码中我们可以看到下面的代码

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPDwULLTE0MTAzNDUwNThkZKr77J2uy7fatyBou8PocG80X4Jt" />

这个就是ViewState在客户端的保存形式,它保存在一个ID为__VIEWSTATE的Hidden中,它的Value是使用Base64编码后的字符串。这个字符串实际上是一个对象(Pair类型)序列化之后的结果。这个对象保存了整个页面的控件树的ViewState。可以使用一些工具将这个字符串进行解码查看其内容,比如ViewStateDecoder,ViewStateAnalyzer。

2.2服务器端:

在服务器端和ViewState机制密切相关的有三个类Page,Control,StateBag。他们3者的关系如下图所示:

图1

Page继承自Control,Control和StateBag是聚合关系,在Control中有一个StateBag的实例ViewState。这三个类互相协作完成ViewState机制的大概过程如下。Page对客户端请求进行处理,在处理的过程中先是将客户端提交的_VIEWSTATE反序列化为对象,调用Control的相关方法给所有的控件装载数据,这些数据是上次请求结束后控件的状态数据。在之后的一些事件中这些状态数据可能被修改。在请求结束之前调用Control的相关方法得到所有控件的被修改过的状态数据,之后Page将其进行序列化,并返回给客户端。在Control中又具体调用StateBag类的方法完成状态数据的加载和保存。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索客户端
, 控件
, viewstate
, 状态
, 机制
, control
, 多次请求
状态保存机制
viewstate保存机制、viewstate、viewstate的用法、viewstate生命周期、asp.net viewstate,以便于您获取更多的相关知识。

时间: 2025-01-03 09:13:11

ViewState机制由浅入深1的相关文章

ViewState机制由浅入深3

2.2.4 StateBag类 ViewState是控件的一个属性,用来使用控件具有记忆功能.在前边的讲述中,我们可以看到控件的一些属性通过使用ViewState能够恢复原来的值,保存本次的值,在Control类中很多方法的实现也是直接调用了ViewState的方法.ViewState的类型是StateBag,下面我们就了解一下在StateBag中是如何实现这些功能的.StateBag定义在System.Web.UI中声明如下: public sealed class StateBag : IS

ViewState机制由浅入深2

2.2.2 Pair类及ViewState的存储 Page及所有控件的ViewState.ControlState都是存储在Pair类的实例中,了解Pair类及ViewState如何存储在Pair类中很重要.Pair定义的System.Web.UI中具体定义如下: public sealed class Pair { public object First; public object Second; public Pair(); public Pair(object x, object y);

用 ASP.NET 2.0 改进的 ViewState 加快网站速度

asp.net|速度     如果您是个经验丰富的 ASP.NET 开发人员,一提起 ViewState ,您可能会不寒而栗,因为您想到的是大量通过"鸡尾酒吸管"吸入的 Base64 编码数据.除非采取步骤进行预防,否则大部分 ASP.NET 页面将有大量辅助数据被存储在一个名为 __VIEWSTATE 的隐藏字段中,多数情况下,甚至不需要这个字段.浏览用 ASP.NET 生成的您喜爱的站点,查看页面源代码,计算隐藏在 __VIEWSTATE 字段中的字符数.我尝试了一下,数量为 80

实现ASP.NET程序性能目标的几种方法

asp.net|程序|性能 第一次在这里写BLOG,希望不要被大家取笑!   一. 调整程序代码   1.避免多次读取相同数据   在循环语句中不要包含无端重复执行的代码,如:   while ( dr.read())   {   if(dr.item["lastname"]==Request.params["lastname"])   return true;   else   return false;   }   在上面循环中,对于DataReader返回的每

C#+ASP.NET 2.0定制复合组件之基础篇

asp.net 摘要:在本系列文章中,我们首先讨论使用ASP.NET 2.0构建一个标准ListBox控件的增强版本(EnhancedListBox).这个控件能够对它的项进行重排序,并且能够实现客户端与服务器端的同步功能.然后,我们把这样的两个控件组合起来创建一个复合控件(ListMover). 一. 引言 构建提供丰富的客户端接口的复杂Web控件经常需要把一些客户端JavaScript代码与控件的服务器端代码集成到一起.然而,在一些情况下,为了达到某种巧妙的效果而把问题搞得过于复杂经常会破坏

轻松解决页面回传后页面滚动到顶端

解决|页面 轻松解决页面回传后页面滚动到顶端 页面回传后页面滚动到顶端,造成这一问题的原因是页面回传,其实等于载入一次页面,新载入的页面会定点到页面的顶端.这一特点会造成很差的用户使用感受,如何解决这一问题呢,我们可以借用隐藏的ViewState机制保存当前页面滚动的位置,在页面回传后调用. <%@ Page language="c#" Codebehind="Test_THIN.aspx.cs" AutoEventWireup="false&quo

Asp.Net下的DataGrid的多层表头

asp.net|datagrid 先看下表:业务员 地 区 北京 上海 深圳 张三 100 200 300 实际上Asp.Net下的DataGrid只不过是一个HtmlTable,只不过在HtmlTable的基础上添加了很多属性.方法,纳入ViewState机制,来生成.控制它:有了这一点认识,事情就很好办了: 我们可以在属性生成器中可以定义列的表头,它实际上只不过是在列之间插入了"</td><td>"的html标记,如此而已:因此根据上面的例子,可以在第3列的

实现性能目标的几种方法

性能 第一次在这里写BLOG,希望不要被大家取笑!一. 调整程序代码1.避免多次读取相同数据 在循环语句中不要包含无端重复执行的代码,如:while ( dr.read()){ if(dr.item["lastname"]==Request.params["lastname"]) return true; elsereturn false;}在上面循环中,对于DataReader返回的每条记录都要对Request.params["lastname"

ASP.NET学习日记文章集

asp.net Web service到底是什么:在什么情况下你应该使用Web service. 分布式应用程序和浏览器 研究一下当前的应用程序开发,你会发现一个绝对的倾向:人们开始偏爱基于浏览器的瘦客户应用程序.这当然不是因为瘦客户能够提供更好的用户界面,而是因为它能够避免花在桌面应用程序发布上的高成本.发布桌面应用程序成本很高,一半是因为应用程序安装和配置的问题,另一半是因为客户和服务器之间通信的问题. 传统的Windows富客户应用程序使用DCOM来与服务器进行通信和调用远程对象.配置好D